题意翻译
如果一个字符串可以由某个长度为k 的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabcabcabcabcabc以3 为周期(注意,它也以6 和12 为周期)。
输入一个长度不超过80 的字符串,输出其最小周期。
输入输出样例
输入 #1
1
HoHoHo
输出 #1
2
思路
因为是求周期,所以我们可以从第一个字符开始,设置周期长度为1,然后逐步放大周期,判断是不是周期可以在假定的周期长度中,每个字符逐步加上周期长度,直到走完字符串,这样来逐个判断.仍然需要注意输出格式.
代码
原始代码
#include <stdio.h>
#include <string.h>
char str[105];
int main() {
int n;
int flag = 1;
scanf("%d", &n);
while (n--) {
scanf("%s", str);
int p = 0;
int len = strlen(str);
for (int i = 0; i < len; i++) {
++p;
flag = 1;
// 如果周期长度不能整除字符串长度,那这个周期肯定不满足条件.
if (len % p != 0) {
continue;
}
for (int m = 0; m < p; m++) {
int temp;
// 逐个判断
for (temp = m; temp < len; temp = temp + p) {
if (str[m] != str[temp]) {
flag = 0;
break;
}
}
// flag = 0时,不满足条件
if (flag == 0) {
break;
}
}
if (flag) {
break;
}
}
printf("%d\n", p);
// 注意输出格式
if (n >= 1) {
printf("\n");
}
}
return 0;
}
参考洛谷题解优化后的代码
#include <stdio.h>
#include <string.h>
char str[105];
int main() {
int n;
scanf("%d", &n);
while (n--) {
scanf("%s", str);
int len = strlen(str);
for (int i = 1; i <= len; i++) {
if (len % i != 0) {
continue;
}
int m;
// 思路同上,这里把代码优化了一下
for (m = i; m < len; m++) {
if (str[m] != str[m % i]) {
break;
}
}
if (m == len) {
printf("%d\n", i);
break;
}
}
if (n >= 1) {
printf("\n");
}
}
return 0;
}