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]],所以失配后只需跳一次即可。

比如:

  a a a a b b
j 0 1 2 3 4 5
next[] -1 0 1 2 3 0
nextval[] -1 -1 -1 -1 3 0
 
  a b c a b d a b c a b d
j 0 1 2 3 4 5 6 7 8 9 10 11
next[] -1 0 0 0 1 2 0 1 2 3 4 5
nextval[] -1 0 0 -1 0 2 -1 0 0 -1 0 2

应该讲得差不多了吧。下面是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串开始匹配的位置)

应该差不多了。嗯。

 

发布了31 篇原创文章 · 获赞 0 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章