解题思路已经包含在代码里了
private int[] getNextArray(char[] chs){
int i;
int k;
int[] next = new int[chs.length];
for(i = 1,k = 0; i < chs.length; i++){
/**
* 如果 chs[i] == chs[k], 说明最大前后缀相等+1 == next[i],因为前0 ~ k-1与 i-k+1 ~ i-1 是相等的
* 如果 chs[i] != chs[k],那得算出next[k-1]的最大前后缀,而不是与chs[0~k-1]一个个的比,只要比最大相等前缀就好了
*/
while(k > 0 && chs[i] != chs[k]){
k = next[k - 1];
}
if(chs[i] == chs[k]){
k++;
}
next[i] = k;
}
return next;
}
public boolean kmp(String str1,String str2){
char[] strA = str1.toCharArray();
char[] strB = str2.toCharArray();
int[] next = getNextArray(strB);
int i;
int k;
for(i = 0,k = 0; i < strA.length; i++){
while(k > 0 && strA[i] != strB[k])
k = next[k-1];
if(strA[i] == strB[k]){
k++;
}
if(k == strB.length){
return true;
}
}
return false;
}