了解 KMP 的原理后可以得知,我们每次都是在找到最后一个不匹配的字符就会移动。(移动j个长度) 已知第 j 个字符不匹配,那么前 0 到 j-1 个字符都是匹配的,0 到 j-1 个字符正好是 j 个,恰好是前缀的长度。(为什么要移动j个长度呢?因为前j个匹配,第j个不匹配,在进行后移的过程中文本串和模式串的匹配长度都不会大于j,因为在第j个位置对于模式串来说已经断开了,故要从这个不匹配的位置之后开始,如何找到这个位置如何进行移动就是KMP)此时我们只要记录下最大的 j 即可。
注意next是找的模式串不是主串。
next信息的另外一个作用:如果当前匹配失败了,取出失败位置的next信息值记为x,下一次匹配就直接跳到x位置的字符再重新进行比较,这不就是相当于把s2往前推的效果吗?这也是为什么求next信息时,规定任何字符串,0位置的next信息为-1。想象一下,当配置串跳着跳着,某一刻你的next信息值小于0了,你就知道不能再往前跳了,也就代表着较长串在这个区间内已经是不可能配出我了,较长串你该重新换个开头了。