kmp之最小循环子串

今天研究了一下杭电 1358题,感觉最小循环子串的问题的重点是理解为什么 len%(len-next[i])==0 可以得出最小循环子串。

next[i]是kmp初始化的一个数组。














从我画的这个图中 可以看出,因为len%(len-next[i])==0 我们可以把len-next[i] 看成是一个整体,当成一个块,比如上图的S[i-1](说明一下,这个S中的下标i和next[i]不是一样的),因为整除,我们可以把len分成n个块,这样只要证明每个快都相等,我们就可以得出len-next[i]是其中的一个循环子串,S[i-1] = S[i-1](上下两个数组是相同的),根据next数组的含义我们可以得出 s[i-2] = s[i-1] 。。。。。s[2] = s[3]  s[1] = s[2].所以我们可以得出 S[i-1] = s[i-2] =s[i-3] ......s[1],所以S[i-1] 也就是len-next[i]这个块可以作为一个循环子串,循环次数为len/(len-next[i])。

下面就是证明为什么len-next[i]是最小的子串,我们可以假设有一个比S[i-

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值