KMP算法中next数组以及nextval的求解(简单,通俗易懂版)

以一个题为例:

计算上图中 next[ j ] 以及 nextval[ j ] 的值。

【 本文中 j 的下标从1开始。】

最长公共前后缀:

···前缀:不包含最后一个字符的所有以第一个字符开头的连续子串。

···后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串。

先看next[ j ],

(1)j 的下标为1 与 2 时,next[ j ]的值默认为 0 和 1

 

(2)j的下标为 3 时,模式串的值为 a 。由于next[3]前面的next[1] 与next[2]的值分别为 a 和 b 。因此没有最大公共前后缀。所以next[3] 的值为 0+1=1

(3)j的下标为4时,模式串的值为 b 。next[4] 的最大公共前后缀为a。因此,next[4] 的值为1+1=2

(4)j 的下标为5时,模式串的值为 a 。next[5] 的最大公共前后缀为 a b 。因此,next[5]的值为2+1=3

(5)j的下标为6时,模式串的值为 a 。next[6]的最大公共前后缀为 a b a 。因此,next[6] 的值为3+1=4。

(6)j的下标为7时,模式串的值为 a 。next[7]的最大公共前后缀为  a 。因此,next[7] 的值为1+1=2。

以此类推,完整的next[ j ] 的值为:

再看nextval[ j ], 

(1)j 的下标为1时,next[ j ]的值默认为 0 。

(2)j的下标为 2 时,模式串的值为 b ,next[2] 的值为 1 。因此,j 的下标为 1 时,模式串的值为 a 。a 与 b 不相等,把next[2] 的值下移。因此,nextval[2] 的值为1。

 

(3)j的下标为 3 时,模式串的值为 a ,next[3] 的值为 1 。因此,j 的下标为 1 时,模式串的值为 a 。a 与 a 相等,把nextval[1] 的值移到netval[3]。因此,nextval[3] 的值为0。

(4)j的下标为 4 时,模式串的值为 b ,next[4] 的值为 2 。因此,j 的下标为 2 时,模式串的值为 b 。b 与 b 相等,把nextval[2] 的值移到netval[4]。因此,nextval[4] 的值为1。

(5)j的下标为 5 时,模式串的值为 a ,next[5] 的值为 3 。因此,j 的下标为 3 时,模式串的值为 a 。b 与 b 相等,把nextval[3] 的值移到netval[5]。因此,nextval[5] 的值为0。

以此类推,完整的nextval[ j ] 的值为:

以上就是KMP算法中next数组以及nextval的求解过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值