KMP算法
1.动态演示
动态演示-计算next数组
动态演示-KMP搜索
2.代码实现
@Test
public void test5(){
String parent = "ABC ABCDAB ABCDABCDABDE";
String child = "ABCDABD";
List<Integer> result = kmpSearch(parent, child);
System.out.println(result);
}
private static int[] getNext(String pattern) {
int[] next = new int[pattern.length()];
int length = 0;
int i = 1;
next[0] = 0;
while (i < pattern.length()) {
char a = pattern.charAt(i);
char b = pattern.charAt(length);
if (a == b) {
length++;
next[i] = length;
i++;
} else {
if (length != 0) {
length = next[length - 1];
} else {
next[i] = 0;
i++;
}
}
}
return next;
}
public static List<Integer> kmpSearch(String parentStr, String childStr) {
List<Integer> result = new ArrayList<>();
int parentStrLen = parentStr.length();
int childStrLen = childStr.length();
int[] next = getNext(childStr);
int i = 0;
int j = 0;
while (i < parentStrLen) {
char a = parentStr.charAt(i);
char b = childStr.charAt(j);
if (a == b) {
i++;
j++;
}
if (j == childStrLen) {
result.add(i - j);
j = next[j - 1];
} else if (i < parentStrLen && childStr.charAt(j) != parentStr.charAt(i)) {
if (j != 0) {
j = next[j - 1];
} else {
i++;
}
}
}
return result;
}