public class KMP {
public static void main(String[] args) {
int index = search("ABC ABCDAB ABCABCABCABDCDABDCE", "ABCABCABD");
System.out.println("in start:" + index);
}
public static int search(String src, String pattern) {
int lps[] = lps(pattern);
int index = -1;
int len = src.length();
if (len < pattern.length()) {
return -1;// no match
}
int j = 0;
for (int i = 0; i < len; i++) {
while (j > 0 && src.charAt(i) != pattern.charAt(j)) {
j = lps[j - 1];
}
if (src.charAt(i) == pattern.charAt(j)) {
j++;
}
if (j == lps.length) {
index = i-j;
break;
}
}
return index;
}
public static int[] lps(String pattern) {
int size = pattern.length();
if (size < 1)
return new int[0];
int[] lps = new int[size];
int i = 0;
int j = 1;
lps[0] = 0;
for (; i < size; i++) {
for (; j < size;) {
char cur = pattern.charAt(i);
if (cur == pattern.charAt(j)) {
lps[j] = i + 1;
i++;
j++;
} else {
if (i == 0) {
lps[j] = 0;
j++;
} else {
i = lps[i - 1];
}
}
}
}
return lps;
}
}
06-03
1027
11-03
3万+
08-29
2958
08-30
232