一、题目描述
二、算法
这道题实际上就是考察的Z 算法。
1、泛化问题描述
对于个长度为 n n n 的字符串 s s s。定义函数 z [ i ] z[i] z[i] 表示 s s s 和 s [ i : n − 1 ] s[i:n-1] s[i:n−1] 的最长公共前缀的长度。 给出计算
z z z 的算法。 注:这里 s [ i : n − 1 ] s[i:n-1] s[i:n−1] 包含 s [ i ] s[i] s[i] 和 s [ n − 1 ] s[n-1] s[n−1]。
2、分析
与 KMP 类似,计算 z [ i ] z[i] z[i] 时需要用到前面计算过程的经验。这个算法的核心在于:维护了 [ l , r ] [l, r] [l,r] 区间,满足 r = max 0 ≤ k < i k + z [ k ] − 1 (1) r = \max \limits_{0 \le k < i}k+z[k]-1\tag{1} r=0≤k<imaxk+z[k]−1(1) l + z [ l ] − 1 = r (2) l+z[l]-1=r\tag{2} l+z[l]−1=r(2)
不难发现, [ l , r ] [l, r] [l,r] 实际上是 s s s 和 s [ l : n