求解KMP算法及next值

来源:互联网 发布:oa软件开发公司 编辑:程序博客网 时间:2024/06/05 11:47
求解KMP算法及next值
KMP算法的关键是理解和求出 next[i] 值。有如下两串,S为母串、P为子串;
                                                           ↓i
s(1)……s(i-j+1)…s(i-j+k-1) s(i-k+1) …s(i-1)   s(i)
           p(1)…    p(k-1)   … p(j-k+1) p(j-1)  p(j)                                 
                             ↑j
其中s(i) != p(j)  但有如下序列匹配: s(i-j+1)……s(i-1)  =   p(1)    ……p(j-1)p(j)
当子串自身中存在                           p(1)p(2)…p(k-1)  =   p(j-k+1)p(j-k+2)…p(j-1)
也就是说                                        p(1)p(2)…p(k-1)   =   s(i-k+1)……s(i-1)  
以一个事例解释下:
比如字符串:abaabaaa
                 a                               next[1] = 0
                 ab                             next[2] = 1
                 aba                           next[3] = 1
                 abaa                         next[4] = 2
                 abaab                       next[5] = 2
                 abaaba                     next[6] = 3
                 abaabaa                   next[7] = 4
                 abaabaaa                 next[8] = 5
咋求next值呢?这里再详细叙述下,拿上面的最后一个为例。因为你要求next[8],所以我们只看前七位。看看他们的匹配过程(自身模式串的匹配)
abaabaaa(不匹配字符用红色标出,最后的字符不看)
  abaaba不匹配
    abaab不匹配
      abaa   匹配
        aba
          ab
            a   匹配(但他不是最大的字符匹配
注意:其实从第4个开始就不用在匹配了,为了说明期间我还是写出来了。希望有助于理解。
于是自身中存在一个四字符的子序列与自身匹配,所以他的next[8]值为4+1=5
下面是next值的函数(注意是改进算法,之间将程序最里程的if..else语句修改下,就是普通的next函数了),可以打印出结果看是不是和你笔算的一样   ^⊥^
原创粉丝点击