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处进行比较)