KMP算法
void getNext(int* nxt, string p){
memset(nxt, -1, sizeof(nxt));
nxt[0] = -1;
int i = 0,j = -1;//j控制前缀,i控制后缀
int lp = p.size();
while( i<lp ) {
if( j==-1||p[i]==p[j] ){
++i;
++j;//先自增,因为PMT向前移动一位
nxt[i]=j;
}
else j=nxt[j];
}
}
int kmp(string t, string p){
int i = 0, j = 0;
int lt = t.size(), lp = p.size();
int nxt[lp+1];
getNext(nxt, p);
while( i<lt&&j<lp ) {
if( j==-1||t[i]==p[j] ) {
i++;
j++;
}else {
j=nxt[j];
}
}
if( j==lp ) return i-j;
else return -1;
}
本文深入讲解了KMP算法的工作原理及实现过程,包括next数组的生成和匹配过程,是理解字符串搜索算法的重要参考资料。
2839

被折叠的 条评论
为什么被折叠?



