KMP快速计算next与nextval

最近在研究数据结构,碰到了计算next与nextval值,查看了大量资料,发现这个方法最是清楚明白,整理后贡献出来,有问题可以留言哟!

方法1:引入了一个maxL,在计算nextval时,比较方便。强烈建议读者按照思路算一遍,再找几道题试试。
方法1


准备工作:写好模式串t,序号从1开始。

maxL:首个为0,计算包含当前字符的串的最大相同前后缀中字符的个数。例如,对于序号3,aba,有一个相同前后缀。特别地,对序号5,ababa有3个。将计算好的maxL填入,如上表。

next:首个为0,填入前一个maxL的值加1,例如,next[2]=maxL[1]+1=0+1=1。

nextval:首个为0,从左至右,比较maxL与next。

               若不同,填入next的值,例如,对于序号2,maxL[2]=0,next[2]=1,则nextval[2]=1。

               若相同,填入该值对应序号的nextval,例如,maxL[3]=next[3]=1。则nextvaL[3]=nextval[1]=0;

方法2:直接计算next与nextval,计算量小一些,在理解方法1的基础上再看。建议两个方法记一个。

 

                                                                                    KMP手算next与nextval2


根据法一,可知next的前两个必为01(据此可以排除选项),仔细观察可知next与maxL的关系,去除maxL(考试不考),但是nextval就会算的麻烦一点。读者根据自身情况选择法一还是法二。

next:前两个填入01,计算不包括当前字符的串的前后缀相同个数。填入该值加1。例如,序号4前,aba,有一个相同前后缀。填入1+1=2。特别地,没有相同前后缀时填1,例如,序号3前,ab,填入0+1=1;

nextval:首个为0,从左至右,比较该序号字符,与next值对应的字符是否相同。

               若不同,填入next值即可。例如,对于序号2,字符b,next[2]=1。b与序号1对应的字符a不同,则填入next,nextval[2]=next[2]=1。

               若相同,填入next值对应序号的nextval,例如,序号3,next[3]=1,序号3字符a与1对应的字符a相同,则nextval[3]=nextval[1]=0。

如果题目中的next是从-1开始的,算完后,全部-1就好。
 

  • 77
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值