循环串问题

首先了解一下最小覆盖串问题即求一个最小的子串使其能够通过复制的方法覆盖整个子串(不用恰好覆盖,可以多出来一块)

例如: ABCDABCDAB 的最小覆盖子串为:ABCD

假设字符串的存储空间为 str[0]~str[len-1], next数组是KMP算法的回溯数组,

一个字符串的最小覆盖子串为str[0]~str[n-1],当且仅当n == len-next[len],

证明见:http://blog.csdn.net/fjsd155/article/details/6866991


循环串问题:即给出一个字符串通过循环后移的操作(即串的每个字符都向后移动一个单位,其中最后一位移动到最前面),重复这样的操作n次,字符串和原串相同,n就叫做该串的循环周期,要求求出最小的循环周期,显然对于任意一个字符串,都有其平凡周期len。这个问题可以通过最小表示法和求原串在加倍串中的匹配来求解,但下面给出一个利用循环串内部性质的解法

用群论的方法可以很好的解决该问题,我们定义一个代数系统< S , *> ,其中S是对给定串的操作(即循环后移不同次),为了描述方便用->^(a1)表示对给定串循环后移a1次, s1 相当于->^(a1),s1*s2可以定义为先把串循环后移a1次,在循环后移a2次,容易证明<S, *>是由->^(1)为生成员的生成群,设该群的的生成周期为k,则因为->^(len) 等价->^(k),所以必有len能被k整除所以我们可以用串的str[0]~str[k-1]恰好覆盖整个串,而且这个是最小覆盖串(如果不是的话,假设是str[0]~str[k1],那就存在k1 < k使得  ->^(k1) 等价 ->^(k),这与假设相矛盾)。

结论 ,判断一个串是否为循环串只要求其自身的next数组判断(len-next[len]能否整除len即可),而其最小循环周期为len-next[len]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值