算法竞赛入门经典:第五章 基础题目选解 5.3 周期串
2015-08-11 11:05
543 查看
/* 周期串: 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc是以3为周期(注意,它也以6和12为周期)。输入一个长度不 超过80的串,输出它的最小周期 输入: HoHoHo 输出:2 思路: 关键找到切分点,从n/2长度算起吗,n/2-1长度,一直到1为止。这类似于希尔排序 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 1024 /* 从步长为2开始算起,若能整除,[若计算是周期,[直接输出; [步长累加,若步长超过一半,输出-1 [步长累加,若步长超过一半,输出-1 计算周期,0到步长内的每个数字,对每个字符与所有跳跃字符都相同 */ /* 关键: 1周期串说白了就是 str[j] = str[j%i],注意步长应该从1开始,而不是从2开始,for(iStep = 1 ; iStep <= iLen/2 ; iStep++) 2 书上方法比我简单在:我是选取步长,将步长项全部比较结束。书上:一趟循环直接将所有步长项比结束 */ int cycleStrLen_book(char* str) { int iLen = strlen(str); int iStep; bool isCycle; for(iStep = 1 ; iStep <= iLen/2 ; iStep++) { isCycle = true; for(int j = 0;j < iLen; j++) { if(str[j] != str[j % iStep]) { isCycle = false; break; } } if(isCycle) { break; } } return isCycle ? iStep : 0; } int cycleStrLen(char* str) { int iLen = strlen(str); int iStep; bool isCycle; //for(iStep = 2 ; iStep <= iLen/2;iStep++)//步长必须从1开始 for(iStep = 1 ; iStep <= iLen/2 ; iStep++) { isCycle = true; if(iLen % iStep != 0) { isCycle = false; continue; } else { for(int i = 0 ; i < iStep;i++)//每个步长的起始位置 { int j = i + iStep; while(j < iLen && str[j-iStep] == str[j])//判断跳跃字符是否都相等 { j += iStep; } if(j < iLen) { isCycle = false; break; } if(isCycle) { break; } } } if(isCycle) { break; } } return isCycle ? iStep : -1; } int main(int argc,char* argv[]) { char str[MAXSIZE]; scanf("%s",str); //printf("%d\n",cycleStrLen(str)); printf("%d\n",cycleStrLen_book(str)); system("pause"); return 0; }
相关文章推荐
- C#语法笔记
- 设计模式解读
- jquery交替实现隐藏、显示
- 装箱和拆箱
- RabbitMQ 三种Exchange
- 杭电 1233 还是畅通工程 【最小生成树&&Kruskal】
- android Material Design 随手记
- gcc 源码分析-前端篇2
- 算法竞赛入门经典:第五章 基础题目选解 5.2 Tex
- 22-IO流-30-IO流(转换流的编码解码)
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- Android L 新特性
- poj 2586 Y2K Accounting Bug
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- Cocos2d-x中,创建Animate的几种方法
- iOS 9应用开发教程之ios9中实现按钮的响应
- chorme提示Adobe Flash Player过期
- ORA-39212 XSL样式错误.
- monkeyrunner学习笔记