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;             
    }
}
posted @ 2025-11-10 17:45  _窗帘  阅读(8)  评论(0)    收藏  举报