UVa455 周期串

博客围绕给定字符串找其重复周期展开。思路是假设周期从1到字符串长度N,依次判断能否成为重复周期,要注意无周期时周期为本身长度N,不能整除N的假设周期不必考虑,将字符串等分成子部,判断对应位置字符是否相等。还给出代码转载链接。

题目描述:给一个字符串,找它的重复周期

思路:

假设周期从1~N,依次看是否能成为该字符串的重复周期。需要注意:

1.若周期串没有周期,其重复周期就是本身长度N

2.假设的周期k如果不能被N整除,自然就不是周期,不必考虑

3.N长的字符串等分成k长的子部,找每一个k长子部对应位置的字符是否相等即可

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     int N;
 6     char s[100];
 7     scanf("%d", &N);
 8     while(N--){
 9         scanf("%s", s);
10         int n = strlen(s);
11         int k, period;
12         for(k = n ; k > 0; --k){  //遍历寻找周期k 
13             int flag = 1;
14             if(n % k != 0)      //不能整除周期自然跳过 
15                 continue;
16         /*其实这里有提升空间,直接j = k, ++j, 判s[j] == s[j%k]*/        
17             int d = n / k;      
18             for(int i = 0; i < k; ++i){
19                 for(int j = 0; j < d; ++j){
20                     if(s[i] != s[i + j * k]) flag = 0;  //出现不满足周期性的地方,标志位置0            
21             }
22         }
23         if(flag) period = k;
24          
25         }
26         if(N > 0)
27         printf("%d\n\n", period);
28         else
29         printf("%d\n", period);    
30     }
31 }

 

转载于:https://www.cnblogs.com/patrolli/p/11171020.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值