相同前后缀
对于长度N
的字符串, 找到其长度最长的相同前后缀的长度 (且长度需<N
)
字符串ababab
的最长前后缀为abab
; 字符串abcdabc
的最长前后缀为abc
这个概念不应该陌生, 因为KMP就是完全基于它的.
前后缀的长度, 必须是< N
的. 因为, 如果可以= N
, 那么任意一个字符串, 其最长前后缀必然是自身
因此, 我们规定, 以下也默认: 最长前后缀的长度, 必须是< N
的
前后缀可以分为2种类型: (1, 长度需<= N/2
(也就是: 前后缀不能相交)) (2, 长度任意 < N
)
KMP使用的是: 第2.
类前后缀
这里, 简称ps_len
为 前后缀的长度, p: prefix, s: suffix
如果只是求一个字符串的ps_len, 那么直接 暴力枚举 + (字符串比较 或者优化下用字符串哈希), 可以O(n)
求解.
这几乎用的很少, 一般都是需要预处理, 即预处理出一个数组来.
前后缀的算法, 或者说, 前后缀的递推式, 有两个, 适用于不同场景:
1, 求字符串的各个前缀的 最长前后缀, 即需得到pre[]
数组
其中