kmp算法求next数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法求next数组相关的知识,希望对你有一定的参考价值。

参考技术A

KMP算法,主要分为2个阶段:

    求next数组。

    字符串匹配

    next数组,就是对给定的“匹配字符串”,求出其每一个子长度字串的“最长前缀和最长后缀相等的长度”。

    匹配串,p="aabcaabbaa", 长度n=10。因此子串为sub[10]:


       sub[0] = "a"sub[1] = "aa"sub[2] = "aab"sub[3] = "aabc"sub[4] = "aabca"sub[5] = "aabcaa"sub[6] = "aabcaab"sub[7] = "aabcaabb"sub[8] = "aabcaabba"sub[9] = "aabcaabbaa"   


    根据“最长前缀和最长后缀相等的长度”,可以求出对应的next数组是:


       next[0] = -1;     // "a"next[1] = 0;      // "aa"next[2] = -1;    // "aab"next[3] = -1;    // "aabc"next[4] = 0;    // "aabca"next[5] = 1;    // "aabcaa"next[6] = -1;    // "aabcaab"next[7] = -1;    // "aabcaabb"next[8] = 0;    // "aabcaabba"next[9] = 1;    // "aabcaabbaa"   

    2. 利用上部求出的next数组,对t和p进行匹配。要点是:

    123   (1)循环匹配(2)如果整个匹配上,则返回匹配位置。(3)如果当前位置没有匹配上,则:如果对应next[x]为-1,则跳过整个p的长度;否则,回溯到其前缀位置进行匹配。匹配上,则右移next[x-1]位置;否则,右移next[x]位置。   

以上是关于kmp算法求next数组的主要内容,如果未能解决你的问题,请参考以下文章

poj2185(kmp算法next数组求最小循环节,思维)

poj2406(求字符串的周期,kmp算法next数组的应用)

kmp算法

字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

KMP算法及拓展KMP算法