KMP的next数组

之前一直对next数组产生理解的不好,今天突然顿悟,以此记录。

首先要理解next数组是对模式串的特性进行了处理。
设模式串为P
1.
假设模式串有如下特性:
当比较到k位置和j位置时(两个字符相等时下标后移)。借个图

因此可以得到公式:
P[0 ~ k-1] == P[j-k ~ j-1]

当P[k] == P[j]时

P[0 ~ k-1] +P[k]== P[j-k ~ j-1]+P[j] 即:P[0 ~ k] == P[j-k ~ j]
由此得到:
next[j+1] == k + 1 == next[j] + 1
为什么会得到这样的一个公式呢?
可以这样理解:
因为从0到k和j-k到j是相等的,此时j+1的位置要填写的回溯值是k+1,即P[j+1] = k+1;
下面在说为什么k + 1 == next[j] + 1,因为next[j]里面存的是k,从上面的图可以看出当j位置发生失配时应该回溯的位置为k。
这里说明一下,当在比较k和j位置时其实是在填写P[j+1]的位置的回溯的值(回溯值即数组的下标)。
相信对KMP算法了解过的都知道,这里不再多说。如果看不懂可以先看看别的博客了解一下。
上面就是对next[j+1] == k + 1 == next[j] + 1这个公式的由来的解释。
当P[k] != p[j]时
当不相等时就比较简单了,因为next[j]中存储的就是当发生失配时需要回溯的位置,所以j = next[j]即可。

以上只是我对之前不理解的地方的看法,在此分享希望可以帮助和我一样困惑的同学。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值