2018-01-24 20:19:48
- 重复字符串匹配
问题描述:
问题求解:
使用brute force的方法求解,也就是依次比较,但是差别就是在A到末尾的时候循环从头开始继续进行比较。
public int repeatedStringMatch(String A, String B) { for (int i = 0,j; i < A.length(); i++) { for (j = 0; j < B.length() && B.charAt(j) == A.charAt((i+j) % A.length()); j++); // i就是A中前面失配的个数,j.length = 部分1 + n * A.length + 部分2 // i + j = i + 部分1 + n * A.length + 部分2 =(n + 1)* A.length + 部分2 // 所以其实就是一个向上取整 if(j == B.length()) return (i+j) / A.length() + ((i + j) % A.length() == 0 ? 0 : 1); } return -1; }
使用brute force的方法求解的运行效率是很低的,可以采用KMP算法加之改进。
public int repeatedStringMatch(String A, String B) { int[] prefix = new int[B.length()]; for (int i = 1, j = 0; i < B.length(); ) { if (B.charAt(i) == B.charAt(j)) prefix[i++] = ++j; else if (j == 0) i++; else j = prefix[j - 1]; } for (int i = 0, j = 0; i < A.length(); i += j - prefix[j - 1], j = prefix[j - 1]) { while (j < B.length() && A.charAt((i + j) % A.length()) == B.charAt(j)) j++; if (j == B.length()) return (int)Math.ceil((double)(i + j) / A.length()); if (j == 0) j++; } return -1; }