直接写出KMP中next数组(附 改良版next)

一、

例如:

位置i12345678
字符串abaabcac
next [ i ]01122312

很久没看KMP了,但数据结构老师讲到了这里,还是得好好看看。想起以前学的时候的绞尽脑汁,就期待老师能讲出通俗易懂的理解来。结果把我的理解讲混沌了,但是确实得到了一个特简单直接写出next数组的方法。

如下:

首先我是next数组从-1开始的,但为了方便看,一下都从1开始。

next[1] = 0 , next [2] = 1,这是毫无疑问的。

然后就是求后面的,

i = 3 时,前缀有a,后缀有b ,最大子串的长度为0 ,则 next[3] = 1 ;

i = 4 时,前缀有a,ab,后缀有a,ba ,最大相同子串的长度为1 ,则 next[4] = 2 ;

i = 5 时,前缀有a,ab,aba,后缀有a,aa,baa,最大相同子串的长度为1 ,则 next[5] = 2 ;

那么总结可得next[n] 的情况,将前面n-1个字符,观察对应位置前缀和后缀最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。


二、

next数组的求解方法是:(来自https://blog.csdn.net/guo_love_peng/article/details/6618170  写的真好!)

第一位的next值为0,第二位的next值为1。

后面求解每一位的next值时,根据前一位进行比较。

首先将前一位与其next值对应的内容进行比较:

1、如果相等,则该位的next值就是前一位的next值加上1;

2、如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;

3、如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。


以上两种方法都是求next数组的,但是有时这种next数组仿佛并不简单实用,例如 : aaaab这种情况。

那么就需要改良优化了。

具体模板如下:(来自 https://blog.csdn.net/u012043391/article/details/52815909)

1、nextval[ 1 ] = 0;

2、从i = 2 开始,若要求nextval[i],将next[i]的值对应位的值与i的值进行比较:
a.若相等,则nextval[ i ] = nextval[ next[i] ];

b.若不相等,则nextval[ i ] = next[ i ];


位置i
12345678
字符串abaabcac
next [ i ]01122312
nextval [ i ]01021302

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值