链接kmp算法
next[i]数组实际上是i之前字符串前缀和后缀的最长的公共串的长度,其中前缀部分和后缀部分不能相交
代码如下:
private int[] kmp_table(String s)
{
int[] next = new int[s.length()];
next[0] = -1;
int j = 0;
for (int i = 1; i < s.length(); i++) {
int k = next[i - 1];
while (k > -1 && s.charAt(k) != s.charAt(i - 1)) {
k = next[k];
}
next[i] = k + 1;
}
return next;
}
private int kmp_search(String text, String pattern)
{
int[] next = kmp_table(pattern);
int m = 0, i = 0;
while (m + i < text.length()) {
while (pattern.charAt(i) == text.charAt(m + i)) {
if (++i == pattern.length()) {
return m;
}
}
m += i - next[i];
i = next[i] > -1 ? next[i] : 0;
}
return 0;
}