首先什么是周期串,举个简单的例子:abcabcabcabc,这个字符串叫做周期串,这个周期串中的abc,abcabc,abcabcabc就是它的子串,他的周期是3,6,12。怎么理解?
abc的长度是3重复的出现四次它的周期是3
abcabc长度是6重复的出现2次它的周期是6
abcabcabcabc长度是12重复出现1次它的周期是12
现在我们要实现一个算法来输出它的周期
#include<iostream>
#include<string>
int main()
{
char word[100];
memset(word,'\0',sizeof(char));
std::cin.getline(word,100,'\n');
int len=strlen(word);
for(int i=1;i<len;i++)
{
if(len%i==0)
{
int ok=1;
for(int j=i;j<len;j++)
{
if(word[j]!=word[j%i])
{
ok=0;
break;
}
}
if(ok)
{
std::cout<<i<<std::endl;
}
}
}
std::cout<<len<<std::endl;
return 0;
}
来说明一下上面的代码,首先我们假设这个周期串的长度为i,则根据这个word的长度,我们这个周期串的周期可能是1,2,3,4...len。所以外面套一个for循环用来遍历各种可能出现周期,然后我们从周期长度的下一个位置开始和前面那个周期子串中的字符逐个的比较,如果发现出现一个不相等了,说明这个串长到此结束。这样说还是有点抽象,我们来看一下下面的图
由上图可以清楚的得出,j=4的时候j%i=0,所以word[0]必须要和word[4]相等,以此类推可以知道word[1]=word[5],word[2]=word[6]...word[j]!=word[i%j]得出一个周期然后执行下次循环计算下一个周期。
结果: