《算法竞赛入门经典(第2版)》 习题3-4 周期串(Periodic Strings, UVa455)
周期串 如果一个字符可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期,注意,它也以6和12为周期输入一个长度不超过80的字符串,输出其最小周期。
分析
从字符串s[0]开始,逐个检测每一个开头为s[0]、结尾为s[i]的串,如果其中一个串是周期,程序结束,输出这个最小周期即可。
代码
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
int main()
{
int i
, j
, n
, ans
, k
, l
, got
;
char s
[100];
scanf("%s", s
);
n
= ans
= strlen(s
);
for(i
=0;i
<n
;i
++)
{
got
= 1;
if(n
%(i
+1)!=0) continue;
else
{
for(k
=1; k
<n
/(i
+1) && got
!=0; k
++){
for(l
=0; l
<i
+1; l
++){
if(s
[0+l
]!=s
[(i
+1)*k
+l
]){
got
= 0;
break;
}
}
}
}
if(got
== 1){
ans
= i
+ 1;
break;
}
}
printf("%d\n", ans
);
return 0;
}