取模:算法提高:周期字串
问题描述
右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
例如:
字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
我们定义,如果一个字符串是以一个或者一个以上的长度为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\n",i); 25 break; 26 } 27 } 28 } 29 return 0; 30 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端