KMP算法
1、相关知识
-
主串:需要匹配的字符串
-
模式串:去匹配的字符串
-
前缀:包括起点不包括终点的字符串
-
后缀:不包括起点包括终点的字符串
-
next数组:主串和模式串不匹配的时候,模式串回退的位置
-
next[j]: 以j结尾的后缀和以1开始的前缀相同字符的个数
2、求next数组模板
们定义char[] chs数组从0开始,chs[1] = 0
private void getNext(char[] chs, int[] next,int n){
for(int i = 2, j = 0; i <= n; i++){
while(j > 0 && chs[i] != chs[j+1]){
j = next[j];
}
if(chs[i] == chs[j+1]) j++;
next[i] = j;
}
}
3、匹配字符串
//枚举文本串
for(int i = 1, j = 0; i <= m; i++){
while(j > 0 && chsS[i] != chsP[j+1]){
j = next[j];
}
if(chsS[i] == chsP[j+1]) j++;
// 如果当前匹配的字符串的长度等于模式串的长度,说明找到了一个位置
if(j == n){
write.write(i-n+" ");
j = next[j];
}
}