KMP的妙用(利用next数组寻找字符串的循环节)

Posted Pic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP的妙用(利用next数组寻找字符串的循环节)相关的知识,希望对你有一定的参考价值。

利用KMP的next数组的性质,我们可以找到next数组的循环节。

先说结论:

设字符串长n,则若其  i % ( i – next[n] ) == 0 ,则其有循环节(循环节数目大于1),其循环节数目为 i / ( i – next[n] )

这里的next数组存储的是匹配到i匹配不成立时,下一个要匹配的位置。即next数组记录的是下一次匹配的位置,而不是下一次匹配的偏移量,若是记录的偏移量,只需修改一下公式即可。

言归正传,我们先证明第一个结论,根据下图来进行说明:

KMP

若结论中的关系成立(整除为4段),则会出现如上图所示情况,其中,A2+A3+A4段 == A1’+A2’+A3’段。

由于

A2+A3+A4段 == A1’+A2’+A3’段

所以:

A2==A1’       A3==A2’      A4==A3’

又因为:

A1’==A1      A2’==A2      A3’==A3

所以:

A2==A1       A3==A2       A4==A3

具有循环节,结论得证。

根据next数组的性质,我们也可以得知此循环节的长度是最小的:

next[n]可以理解为字符串前缀与后缀最大的相同串。所以剩下的A1即为长度最小的循环节。

第二个结论很容易就能得出。

以上是关于KMP的妙用(利用next数组寻找字符串的循环节)的主要内容,如果未能解决你的问题,请参考以下文章

poj2185(kmp算法next数组求最小循环节,思维)

UVAlive 3026 KMP 最小循环节

妙用next数组打表求最小循环节len

KMP解决字符串最小循环节相关问题

hdoj1358 Period字符串--最小循环节 i/next[i]即为其长度

kmp+最小循环节poj 2406 Power Strings