《入门经典》——6.22
周期字符串:
如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。
样例输入:HoHoHo
样例输出:2
分析:基于这道题目的数据量,这里利用基本的穷举法就可以解决。我们从这个字符串的头元素开始,从小到大枚举最小周期串的长度,然后判断其是否是周期串,如果是周期串,直接输出当前枚举的值然后程序终止。
那么现在我们面临的一个问题是,如何判断从头元素开始长度为i的子串是否是这个字符串的周期串,我们从母串s的第i位开始往后枚举,用临时变量j来记录当前位置,一旦出现s[j%i] != s[j],则可立马断定当前子串不是周期串,跳出循环枚举下一个长度。
其伪代码如下:
for i ,1 to len
if(len % i== 0
{
for j , i to len
if(s[j] != s[j%i]) 当前子串不是周期串;
}
简单的参考代码如下:
#include<cstdio> #include<iostream> #include<cstring> const int maxn = 85; using namespace std; char s[maxn]; int main() { while(cin>>s) { int len = strlen(s); for(int i = 1;i <= len;i++) if(len % i == 0) { int ok = 1; int index = 0; for(int j = i;j < len;j++) { if(s[j] != s[j % i]) {ok = 0;break;} } if(ok) {printf("%d\n",i);break;} else continue; } } }