看了不少网上的证实,它们的关注点都错了,它们证实的是什么呢?算法
x a1 a2 y b
x a1 a2 x c
复制代码
失败点是最后的b-c
,而后c前面的x
和开头的x
是相同的,这个x
就是next[j]的那一段,KMP下次比较调整后为:bash
x a1 a2 y b
x a1 a2 x c
复制代码
KMP算法是直接从b
和a1
的比较开始,而须要比较y
和x
了。这些文章的证实点就是x
和y
是相等的,由于失败点是b-c
,这时就说明了x
和y
是相等的了,这一点很容易看出来。spa
但问题是为何能够直接跳过这么多位置呢?为何移动一个位置来比较就必定会失败呢? 这个才是这个算法最须要证实的地方吧。就这个例子里,为何x不用和a1比?为何不用和a2比呢?code
示例说明:字符串
源字符串source,简称S,是被匹配的字符串,模式串pattern,简称p,是较小的那个字符串。 对p有p1 p2 p3 p4 px py...
,而后在px失败了,这就意味着它以前p1-p4都是匹配到的,那假设S中对应的字符为:p1 p2 p3 p4 s1 s2...
,移动一位后:class
p1 p2 p3 p4 s1 s2...
p1 p2 p3 p4 px py...
复制代码
假如这个时候匹配成功,那么就有p2 p3 p4
= p1 p2 p3
,根据前面对next值的定义,这时对px
它的next值就是3;next
next[i]值就是存在一个值k,使得(0, k-1)这一段跟(i-k+1,i)这一段是如出一辙的。移动
再日后移一位:copy
p1 p2 p3 p4 s1 s2...
p1 p2 p3 p4 px py...
复制代码
若是这时匹配成功,那么p3 p4
=p1 p2
,那px
的next值就是2。而若是咱们已经知道了px
的next值为1,就能够判断出这两种状况是不可能匹配成功的。co
即匹配失败后,每日后移动一步若是成功,都有一个对应的next值,并且这个next值是严格递减的,因此知道实际的next值以后,更大的next就一定是不可能的,那么以前的移动也就是不可能匹配成功的。
更小的有没有可能? 有,由于next值是知足条件里最大的那个,因此更小值它是可能知足条件的。但那就是下一次匹配以后的问题了,如今只是剔除掉一些绝对不可能的状况。