KMP算法之Next算法之如何计算
简的描述
K,J为两个“指针”,K指向前缀,J指向后缀。
当P[K]==P[J],则 K++,J++,匹配下一个字符
当P[K]!=P[J],则K=next[K],进行回溯
抛出疑问
为啥回溯K呢???
因为从左到右,前缀是固定的,后缀会随J++发生巨大的变化
next是怎么定义的??
例如next[K],指的是下标为K个字符前的最长相同前后缀的长度。有点拗口,但是看过KMP算法的原理应该懂这是啥。
所以看懂下面的图
本来想录视频滴,实在太害羞就没录
最简单的实现
void getNext(string &p,int next[]){
int k=-1,j=0;//初始化
next[0]=-1;
while(j < p.length() - 1){
if(k == -1 || p[k] == p[j]){//匹配下一个
k++;j++;
next[j]=k;
}else k = next[k];//回溯
}
}
当然这不是最完善的版本,还有改善的空间,我还没看透…
所以等我看透了再发。