1. 扩展KMP问题:
求字符串S的所有后缀和字符串T的最长公共前缀。
扩展KMP可以用来解决很多字符串问题,如求一个字符串的最长回文子串和最长重复子串。
2. 拓展KMP的next[]数组怎么计算?
在解上面这个问题前我们要先解决一个类似的问题:
求字符串s的所有后缀和字符串s本身的最长公共前缀;
我们用 next[] 数组保存这些值;
现在我们假设要求 next[x] ,并且 next[i] (0<i<x) 的值都已经求出;
我们设 p=k+next[k]−1 , k 是使
如图所示:
现在整理一下问题:
已知: s[k..p]=s[0..next[k]−1] ,求 s[x..n−1] 与 s[0..n−1] 的最长公共前缀;
解:
由 s[k..p] = s[0..next[k]−1] 得:
s[x..p] = s[x−k..next[k]−1] …………………….(1) 这个是显然的并设 L1=p−x+1
因为