Pku acm 2406 Power Strings数据结构题目解题报告(十八)----kmp算法

关于kmp算法,大家都非常熟悉,其涵义非常难懂,以至于我学习kmp算法的时候一直怀疑自己的智商,其具体思想,这里就不多说了,网上也有很多资料,我用的是 严蔚敏老师的书,实现也是按说上的方法实现的,推荐大家把 kmp 算法彻底弄明白了再做 poj 相关的几道题: 2406 Power Strings 1961 Period 2752 Seek the Name, Seek the Fame
该题的题意是这样的,给若干个字符串,判断该字符串最多重复了几次,比如,给 ababab,结果是3,因为ab重复了3次,因为求最多重复了几次,所以结果不是1,在比如abcdabcd结果是2,abcd结果是1.
我们要根据 kmp算法中的next函数来解决这个问题,以ababab为例加以说明:
String: ababab
Next:  0112345
这里根据后面的需要多计算了一位 next值。
我们用 ababab即作为主串有作为模式串来进行匹配,假设匹配到第7为时不匹配了(下标中1开始),要根据next[7](=5)的值继续匹配:
ababab*
ababab&
ababab*
 ababab
这样,我们用( length+1)-next[length+1]就是字符串向右移动的位数,在该例中为7-5=2.然后用总的长度除以这个向右移动的位数,如果能除尽的话,结果就是重复的次数,否则重复的次数为1.即:
if(length%((length+1)-next[length+1])==0)
                    count=length/(length+1-next[length+1]);
else
                    count=1;
在该例中为 6/2=3.
因为这里的 next下标从1开始,所以造成了对下标操作的复杂。
带有详细注释的代码可以在 http://download.csdn.net/user/china8848/获得
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值