zoukankan      html  css  js  c++  java
  • 取模:算法提高:周期字串

    问题描述
      右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
      我们定义,如果一个字符串是以一个或者一个以上的长度为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 }
  • 相关阅读:
    泛在电力物联网建设路线
    如何建设泛在电力物联网?
    泛在电力物联网到底该怎么建?
    泛在电力物联网(能源互联网+物联网)浅析
    泛在电力物联网分析—架构形式
    泛在电力物联网:两个业务 两种发展逻辑
    国网“泛在电力物联网”的战略与逻辑
    MVC中使用Hangfire按秒执行任务
    hangfire 实现已完成的job设置过期,防止数据无限增长
    解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12614009.html
Copyright © 2011-2022 走看看