取模:算法提高:周期字串

问题描述
  右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
  我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
  例如:
  字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
  右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
输入格式
  一个最大长度为100的无空格的字符串。
输出格式
  一个整数,表示输入的字符串的最小周期。
样例输入
HaHaHa
样例输出
2
样例输入
Return0
样例输出
7
 
我自己的思路:差不多可以说是枚举,枚举任何一个可能的周期,然后再记录任何记录后边的任何一个周期的字符串与第一组字符串进行比较,代码看起来很难懂,很繁琐。
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 
 5 int main(void)
 6 {
 7     char s[101] = {0};
 8     char temp1[51] = { 0 };
 9     char temp2[51] = { 0 };
10     int len;
11     int i,j,k = -1,m = -1;
12     int max,n = 2,l;
13     int flag = 0;
14 
15        gets(s);
16     len = strlen(s);
17     for (i = 1; i <= len; i++)
18     {
19         if (len % i == 0) //周期是i
20         {
21             for (j = 0; j < i; j++)
22             {
23                 temp1[++k] = s[j];  
24             }
25             j = 0;
26             while (1)
27             {
28                 j = j + i; //下限
29                 if (j >= len)
30                 {
31                     flag = 1;
32                     break;
33                 }
34                 max = n * i;
35                 for (l = j; l < max; l++)
36                 {
37                     temp2[++m] = s[l];
38                 }
39                 if (strcmp(temp1, temp2) != 0)
40                 {
41                     break;
42                 }
43                 memset(temp2, 0, m + 1);
44                 m = -1;
45                 n++;
46             }
47         }
48         if (flag == 1)
49         {
50             break;
51         }
52         memset(temp1, 0, k + 1);
53         memset(temp2, 0, m + 1);
54         m = -1;
55         k = -1;
56         max = 0;
57         n = 2;
58     }
59     if (i > len)
60         printf("%d", len);
61     else
62         printf("%d",i);
63     return 0;
64 }                                                                                                                  

 然后去看了看别人的代码,很精妙,思路是巧妙的利用取模的方法比较字符串的字母,当前下标对周期取余就是第一个周期的各个字母,然后再与当前下标字母比较,代码简短,好理解。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {    
 5     char str[105];    
 6     scanf("%s",str);    
 7     int l=strlen(str);   
 8     int i,j;
 9     for(i=1; i<=l; i++)    
10     {        
11         int flag=1;        
12         if(l%i==0)        
13         {            
14             for(j=i; j<l; j++)            
15             {                
16                 if(str[j%i]!=str[j])                
17                 {                    
18                     flag=0;                    
19                     break;                
20                 }            
21             }            
22             if(flag)            
23             {                
24                 printf("%d
",i);                
25                 break;            
26             }        
27         }    
28     }    
29     return 0;
30 }
原文地址:https://www.cnblogs.com/ZhengLijie/p/12614009.html