package com.interview.books.fgdsb; import com.interview.books.question300.TQ6_GCDCalculator; /** * Created_By: stefanie * Date: 15-2-2 * Time: 下午10:49 */ public class NLC26_MinimumCoverMatrix { public int min(char[][] matrix){ int rows = 1; for(int i = 0; i < matrix.length; i++){ rows = lcm(rows, minRange(matrix[i])); } int cols = 1; for(int j = 0; j < matrix[0].length; j++){ char[] chars = new char[matrix.length]; for(int i = 0; i < matrix.length; i++) chars[i] = matrix[i][j]; cols = lcm(cols, minRange(chars)); } return rows * cols; } public int lcm(int num1, int num2){ if(num1 == num2) return num1; int gcd = TQ6_GCDCalculator.gcd(num1, num2); return num1 * num2 / gcd; } public int minRange(char[] chars){ int[] next = new int[chars.length + 1]; next[0] = 0; next[1] = 0; for(int i = 2; i <= chars.length; i++){ int j = next[i-1]; while(true){ if(chars[j] ==chars[i-1]){ next[i] = j + 1; break; } else if(j == 0){ next[j] = 0; break; } else j = next[j]; } } return chars.length - next[chars.length]; } public static void main(String[] args){ NLC26_MinimumCoverMatrix finder = new NLC26_MinimumCoverMatrix(); char[][] matrix = new char[][]{ "ABABA".toCharArray(), "ABABA".toCharArray() }; System.out.println(finder.min(matrix)); //2 matrix = new char[][]{ "ABCABCA".toCharArray(), "ABDABDA".toCharArray(), }; System.out.println(finder.min(matrix)); //6 matrix = new char[][]{ "ABCDABCA".toCharArray(), "ABDDABDA".toCharArray(), "ABCDABCA".toCharArray(), }; System.out.println(finder.min(matrix)); //14 } }