KMP算法
求Next数组:
Next数组表示当前元素的最长公共前后缀。计算方法如下:
1,第一个元素为0.
2,若当前元素可以匹配前缀字符的末尾,则将Next[ i ]+1
3,若当前元素不能匹配前缀字符的末尾,则在该元素前一个元素的检测,是否可以直接使用前缀简化匹配。需要注意的是,要进行反复地回退,而不是单单地检查前一个元素。例如abacabacabd这种字符串,出现两次abac,得回退到最开始的abac才能计算。
void built_next()
{
Next[1]=0; //字符串从1开始,j表示当前有多少个元素得到匹配
for(int i=2,j=0;i<=n;i++)
{
while(j&&p[i]!=p[j+1]) //前一个元素匹配,但是当前不匹配
j=Next[j]; //需要使用循环反复回退j
if(p[i]==p[j+1]) j++; //j以及前面的元素已经匹配,若下一位也匹配,则增加
Next[i]=j;
}
}

浙公网安备 33010602011771号