题目描述:如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的字符串,输出其最小周期。
题目分析:最直接最简便的方法无无疑是枚举法,从1开始枚举周期k,当遇到的第一个k满足周期的条件时,当前k就是最小周期,直接结束输出就可以了。
注意:判断k是否为周期的方法大致上都相同,如a[i]==a[i%k],a[i]==a[i+k](注意界限),一开始没想到取余,就直接用了a[i]==a[i+k],于是在界限上的处理很麻烦,但直接a[i]==a[i%k]就不用担心那么多了。
代码如下:
//TEST
//abcabcabcabc -----3
//qwerqwerqwerqwer -----4
//asasasas -----2
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int T;
char n[85];
cin>>T;
while(T--){
cin>>n;
int len=strlen(n),k=1,i;
for(k=1;k<=len;k++){
if(len%k==0){
for(i=0;i<len;i++)
if(n[i]!=n[i%k])
break;
if(i==len){
cout<<k<<endl;
break;
}
}
}
if(T) cout<<endl;
}
return 0;
}
总结:
1.在环状序列的处理上,取余显然要比加减方便。
2.对于for(初始化;条件;循环计数器的变化),其中条件语句尽量采用单一的表达式,其他多余的判断直接加在循环里不容易出错。及遵循for的标准形式:for(int i=0;i<n;i++)。(错误:for(k=1;k<=len&&len%k==0;k++),当len%k!=0是直接退出循环,而非跳过当前循环,与本意不符)
3.一般求周期等最值等直接考虑枚举法,这样出现的第一个值即为最值