KMP算法之Next数组详解

最近刚好学到了kmp算法,对我来说还蛮难的,原理还好理解,就是next数组的求解让我很懵

旁听了一下隔壁班大佬的分享,觉得他们讲得特别好,就想来记录一下

最长公共前后缀

kmp算法首先要找“最长公共前后缀”,其定义为:A的“最长公共前后缀”是“A中以最后一个字符结尾的非前缀子串”与“A的前缀”能够匹配的最大长度。
例:ababab
我们从“最大长度”6开始向下枚举
若答案是6。根据定义,“A中以最后一个字符结尾的非前缀子串”是ababab?我们注意到,ababab也算它自身的一个前缀
因此,在枚举时,要从这个字符串的长度减一开始枚举!


若答案是5,则“非前缀子串”为babab。而“前缀”是ababa。两者不相等。


若答案是4,则“非前缀子串”为abab,而“前缀”是abab。两者相等。
所以我们可以确定,字符串”ababab”的“最长公共前后缀”长度为4。

有什么用?

举例说明:有两个字符串

S: abaacababcac
T: ababc
首先,根据最长公共前后缀,我们写出T串的所有前缀的“最长公共前后缀”长度:
T[0~0] = “a”,最长公共前后缀长度:0
T[0~1] = “ab”,最长公共前后缀长度:0
T[0~2] = “aba”,最长公共前后缀长度:1
T[0~3] = “abab”,最长公共前后缀长度:2
T[0~4] = “ababc”,最长公共前后缀长度:0
我们把求得的这5个数记为X数组(因为它还不是next数组)

这个更改后的X数组就是next数组,下图是上面的执行

当然我们目前只是枚举,接下来如何用算法实现求next数组。。。未完待续

猜你喜欢

转载自www.cnblogs.com/zlszls3113373723/p/12785676.html