如何秒杀KMP字符串匹配的next数组

这里只讲KMP算法里的next数组如何计算,至于有什么作用可以看别的文章。

KMP算法在我看来是比较难理解的,但是求串的next数组这种题目经常考。


1        next数组计算方式

  1.  第一位直接写0,第二位直接写1
  2.  从第三位开始,找第三位前面的子串的前缀与后缀相等的最大长度。其next值就是最大长度+1

2        解释

        这里比较难理解的就是第二条,什么叫前面子串的前缀与后缀相等的最大长度

        这里举个例子,有一个字符串ababaaababaa,求第四位的next值

        前四位是abab,那么根据第二条规则,要找当前的next值,就看其前面子串,这里就是aba。那么aba的前缀与后缀相等的最大长度又是什么呢?

        这里a叫一个前缀,ab也叫一个前缀,但aba就不是一个前缀,他已经和第四位前面的子串相同了。

        同样的道理,a是一个后缀,ba也是一个后缀,但aba不是一个后缀,他已经和第四位前面的子串相同了。

        

        搞懂了什么叫前缀和后缀,那么接下来就是理解前缀后缀相同的最大长度。

        我们知道a是一个前缀,a是一个后缀,a等于a,那么接着找,看看有没有更大的。ab是一个前缀,ba是一个后缀,但ab不等于ba。所以这里的最大长度为1,那么根据第二条规则,next值等于最大长度+1,所以第四位最大长度为2。

3        例题讲解

那么用一道例题来讲解一下,你可以用张草稿纸跟这写。

        根据规则1,第一位写0,第二位写1。

        从第三位开始,就要根据当前位前面的子串的前缀和后缀相等的最大长度+1来计算

        第三位前面的子串是ab,显然最大长度为0,所以第三位的next数组就是0+1=1。

        第四位前面的子串是aba,刚才讲的就是这个例子,next值是2。

        第五位前面的子串是abab,可以一眼看出,前缀是ab,后缀是ab的时候满足前缀等于后缀并且长度最长,长度为2,next值还要+1,所以第五位next值是3。

        同样的道理,一直找......

        实际上算到第三位就已经知道答案了,选C。

4         总结

        实际上要求next数组还是很简单的,就是要注意细节,不要找漏最大长度就好。

5        更多例题练习

   

 (1)  

   

(2) 

 

6        例题答案

(1) B        

(2)

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值