#include<stdio.h> #include<string.h> int main() { int n,i,k,m,j,x,t; char s[85]; scanf("%d",&n); for(k=1;k<=n;k++) { memset(s,'\0',sizeof(s)); scanf("%s",s); m=strlen(s)-1; for(i=0;i<=m;i++) { for(x=1,j=0,t=i+1;t<=m;t++) { if(s[t]==s[j])j++; else { x=0;break; } if(j==i+1)j=0; } if(x==1&&j==0){ printf("%d\n",i+1);break; } } if(k!=n)printf("\n"); } return 0; }
求循环节和周期的问题已经是第二次或第三次碰到了,但是还是在细节上有点小问题,如果做过的题目不能正确快速的写完的话,那刷题意义也将减半。
这道题其实就是暴力,应该是简单暴力,遍历全部元素,考察已确定长度是否为周期,是否足够构成循环节,应考虑到各种情况。
从这道题中也可以发现一些问题,值得去学习的:
1.不应该使用过于繁琐的办法:再开一个数组,把选中的循环节部分放进去,再将两个数组进行比较,重复这种操作,也不应该开一个变量计数周期。这些都是增加代码复杂度,增加编程时间,应当注意到其实只需要利用同一个数组,开一个变量j圈进s中开头的长度作为循环节长度(其实差1)循环内让后面的部分与已圈进的部分进行遍历,看是否构成循环,即有无不同项存在,如果是循环成立的话,循环节与后面部分应构成重复相等,而不会执行到else中跳出遍历,但多数情况总会执行else,注意j每次大于i后就需要归0,从头在此循环循环节。
2.注意特例:abababa(此时循环节未判断出错,但循环节并未执行完,循环是不完整的,即j!=0,若循环节我是完整的,则我循环节应该是判断完,归为0的),abcabcabcabf,aabcfaaabcfa(这种出现了不能把循环节直接跳到出错位置的情况,若直接跳到出错位置,此时循环节会在扩大为aabcf后直接扩展到aabcfaaa循环节就错了,导致所以结果均出错)