kmp

 

附有KMP详细讲解。

题意就是,求一个字符串最多可以平均分割成几个相等的字串。

根据KMP算法求出next数组,考查字符串最高位i的next[i]的值是否满足:

  1. 字符串长度可以被(i-next[i])整除
  2. 第i个字符与第next[i]个字符相等

如果满足以上条件,则答案为(字符串长度÷(i-nexi[i]));否则,答案为1。

代码:

 

要知道本题的原理,首先要了解KMP算法中的next[]和nextval[]。

我的理解是,假设a是源字符串,b是要进行匹配的字串,next[i]及nextval[]通过b串生成。i指向a串当前进行匹配的字符,j指向b串当前进行匹配的字符。

规定,next[]与nextval[]第一个元素的值为字符串起始元素序号减1。

next[j]是当b[j]失配(即a[i]!=b[j])时,j往前跳的位置。能保证:b[0]到b[j-1]均与a[i]前j-1个字符(不包括a[i]本身)一一匹配;且此时next[j]能保证b[0]到b[next[j]-1]均与a[i]前next[j]-1个字符(不包括a[i]本身)一一匹配的,小于j的最大值。

nextval[i]与next[i]一样,只不过,b[j]有可能等于b[next[j]],所以失配后,用next[]可能要跳几次才能找到a[i]与b[j]不同的值继续匹配;而b[j]不会等于b[nextval[j]],所以失配后只需跳一次即可。

比如:

 aaaabb
j012345
next[]-101230
nextval[]-1-1-1-130
 
 abcabdabcabd
j01234567891011
next[]-100012012345
nextval[]-100-102-100-102

应该讲得差不多了吧。下面是KMP算法的模板:

生成next[]的模板:(s为传入的字符串,l为s的长度,next[]为要生成的next数组;如果是string类型,则将“char s[]”改为“string s”即可)

 

生成nextval[]的模板:(s为传入的字符串,l为s的长度,nextval[]为要生成的nextval数组;如果是string类型,则将“char s[]”改为“string s”即可)

 

KMP算法:(a为a串,la为a串长度,b为b串,lb为b串长度,(b串生成next[]或nextval[]),pos是a串开始匹配的位置)

 

应该差不多了。嗯。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值