关于 KMP 算法中next数组与最小循环节

我们设 next 表示 KMP 中求得的next数组,其中 next[i] 表示 i 前面的字串所对应的最长公共前后缀,字符串为 S ,长度为 n ,下标从 1 开始,同时设 p 表示这个字符串的最小循环节,于是得到如下结论:

p = n - next[n]

下面是证明:

1.首先我们假设 L = next[n] 即 S[1...L + 1] = S[n - L...n],令 p = n - L,注意到n - p = L 。通过公共前后缀我们知道对任意 i, 0 \leq i \leq n - p (0 \leq i \leq L) 有:

S[i] = S[n - L + i] = S[i + p]

所以由上我们证得 p 为一个循环节。

2.再次我们假设 S 完全由 k 个相同的块 t(\left | t \right | = p) 拼接而成,且 n = kp (整倍重复)。我们考虑长度为 n - p 的前缀和后缀:

  • 前缀 S[1...n - p] 等于 t^{k - 1} (即 k - 1 个 t 连续)
  • 后缀 S[p...n] 也是 t^{k - 1} 

由上说明存在一个公共前后缀长度至少为 n - p, 于是 next[n] \geq n - p 

由第一点我们得知对于任意一个公共前后缀长度 {L}' 都会产生一个周期 {p}' = n - {L}' , 如果存在更大的公共前后缀(即 {L}' > n - p) , 则对应的周期 {p}' = n - {L}' 会满足 {p}' \leq p , 但是 p 已经是我们假设的最小循环节,这与我们假设矛盾。因此不能有更大的公共前后缀了所以next[n] = n - p
我们把上述两点合并后我们得到:

  • 若 next[n] = L , 令 p = n - L 则 p 是一个周期.
  • 若又满足 n = kp, 那么字符串可以被整除成若干段长度为 p 的块,且这个一定为最小周期(否则存在更小周期会导致更大的公共前后缀,这与我们定义的 next 数组冲突)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值