KMP算法对next数组的理解 - 一上午的思想结晶


这里的对next数组的解释仅个人想法,有错误请提出。


我们现在讨论的是求解next数组(设str是子串):

首先明确next数组是什么:
next数组保存的是最大相同前缀后缀的长度+1
比如ababc,在c这个位置最前面ab跟ab相等且长度最大,next[5]=2+1

一. 当str[i]=str[j]时,next[++j]=++i;(理解为当主串发生不匹配时,下一个比较位置就是上图的i的下一个位置了)

二.当str[i]!=str[j]时,这时应该怎么考虑呢?

1.首先我们要明确我们这一步在干什么,就是找到0-j(包括j)的最大相同前缀后缀到底有多长。

2.i和j能够到达当前的位置也就说明i和j之前的元素完全等同(p1=p2)可是在i和j处发生了不匹配,但这并不代表我们前功尽弃了呀,因为毕竟我们走过了来时的路,我们之前将j之前信息保存在next数组中啊。

3.下面重点来了:在i之前(p1中)我们的信息是保存在next[i]当中的,也就是说我们知道图中的某处1,2肯定相等,也就是说i之前的最大前缀后缀我们知道啊。

4.上面说过p1跟p2完全等同,那么p2中必然存在1`和2`完全与1,2等同(图中p2中的1` 2`)

5.下面我重申一下我们的的目的:不就是找到0-j(包括j)的(还没有比较next[i]和j之前)最大相同前后缀么 这个图很明显了吧!我画的最长的那根线其实就是j之前(不包括j而且还没有比较next[i]和j之前)的最大相同前后缀了。那么接下来只用比较next[i]处的元素(图中)与j的处的元素就行了,如果相等next[++j]=next[i](也就是next[i],不等接着递归往next[i]之前找(也就是next[i]处不匹配的下个位置就是next[next[i]]与j处进行比较)







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值