求解KMP算法及next值

求解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函数了),可以打印出结果看是不是和你笔算的一样   ^⊥^
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值