ACM学习历程23——最小周期串问题
最小周期串问题属于字符串操作的基本题型之一,要求给定一个字符串找出其中最小的周期长度和最小周期子串。对于周期串的定义如下:如果一个字符串是以一个或者一个以上的长度为K的重复字符串连接成的,那么这个字符串就叫做周期为K的串。找最小周期串的方法可以通过以下方式实现:
一、从字符串的起始位置遍历,对于字符串长度为N的字符串,那么周期串的可能长度介于1—N之间,所以可以假设周期串的长度为i,其中1<=i<=N。满足最小周期串的条件之一是length%i==0,这是因为如果所述i是字符串的周期串长度,那么整个字符串可以被划分成整数个长度为i的周期子串,如果这个整除的条件不成立,说明i也不是字符串的周期串长度。满足最小周期串的条件之二是,变量j从i的位置开始一直到字符处结束的位置,满足(s[j]!=s[j%i])这个条件,这是因为若从0到i-1这个区间组成的子串是该字符串的周期串,那么从i到length-1的位置是该最小字符串的若干次重复。由于上述i的取值是从1即从最小值开始取值的,因此当上述两个条件都成立时,即可求得最小周期串长度和最小周期串。
#include<iostream>
#include<string>
using namespace std;int main()
{int i,j;int flag;//判断最小周期串是否找到,找到值为1,否则为0char ss[100];string s;while(cin.getline(ss,100)){s=ss;int length=s.length();for(i=1;i<=length;i++){if(length%i==0){flag=1;for(j=i;j<length;j++){if(s[j]!=s[j%i]){flag=0;break;}}if(flag){cout<<"The cycle="<<i<<endl;cout<<"The minimum string="<<s.substr(0,i)<<endl;break;}}}}return 0;
}
测试结果:
121212
The cycle=2
The minimum string=12
1234512345
The cycle=5
The minimum string=12345
二、下面的代码实现方式原理和上述一样,只是在循环的部分略有区别,但思想是一样的,直接上代码。
#include<iostream>
#include<string>
using namespace std;int main()
{int i;char ss[100];string s;while(cin.getline(ss,100)){s=ss;int length=s.length();for(i=1;i<=length;i++){if(length%i==0){int j=i,k=0,N=1;while(j<length && k<i){if(s[j]==s[k]){j++;k++;if(k==i){k=0;N++;}}else{N=1;break;}}if(j==length){cout<<"T="<<i<<endl;cout<<"N="<<N<<endl;cout<<"The minimum string="<<s.substr(0,i)<<endl;break;}}}}return 0;
}
测试结果:
123123
T=3
N=2
The minimum string=123
ACM学习历程23——最小周期串问题相关推荐
- 周期串java_求最小周期串
如果一个字符串可以由某个长度为k的字符串重复多次得到,则该串以k为周期.例如,abcabcabcabc以3为周期(注意,它也以6和12为周期).输入一个长度不超过80的串,输出它的最小周期. 样例输入 ...
- 字符串最小周期串问题
问题描述: 如果一个字符串可以由某个长度为n的字符串重复多次得到,则该串以n为周期.例如,abcabcabcabc以3为周期(注意,它也以6和12为周期). 输入一个长度不超过100的串,输出它的最小 ...
- ACM学习历程—UESTC 1226 Huatuo's Medicine(数学)(2015CCPC L)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1226 题目就是构造一个对称的串,除了中间的那个只有1个,其余的两边都是对称的两个,自然答案就是2*n-1. ...
- ACM学习历程—HDU2476 String painter(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...
- 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始
以下以目前遇到题目开始记录,按发布时间排序 ACM之递推递归 ACM之数学题 拓扑排序 ACM之最短路径做题笔记与记录 STL学习笔记不(定期更新) 八皇后问题解题报告 转载于:https://www ...
- ACM学习历程—HDU2068 RPG的错排(组合数学)
Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿 ...
- ACM学习历程—HDU5586 Sum(动态规划)(BestCoder Round #64 (div.2) 1002)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5586 题目大意就是把一段序列里面的数替换成f(x),然后让总和最大. 首先可以计算出初始的总和,以及每 ...
- ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
http://hihocoder.com/problemset/problem/1290 这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试 ...
- ACM学习历程—HDU5668 Circle(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5668 这题的话,假设每次报x个,那么可以模拟一遍, 假设第i个出局的是a[i],那么从第i-1个出局的人后,重新 ...
最新文章
- nyoj117求逆序数 并归排序法
- 五、Netty核心组件
- Spark广播变量实现原理及基础编程
- 关于Unity的入门游戏飞机大战的开发(上)
- 【目标检测】IoU、GIoU、DIoU、CIoU Loss详解及代码实现
- 贵气烫金剪纸牛年新年春节海报PSD分层素材模板
- Hexo博客优化之Next主题美化
- 八种常规常用的SQL查询语句
- Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
- Notepad++ 替代品开源了!
- 【博文笔记】Attentive Reader\Impatient Reader:机器阅读理解之开山之作Teaching Machines to Read and Comprehend
- 物联网模块选择注意事项
- git fetch 出错“error:failed to run repack”
- 服务器文件增量备份,服务器文件增量备份
- Introduction to Python(2)
- WPF学习之深入浅出话模板
- 国内企业云盘哪个好用?
- JAVA 类的继承(私有属性、自动转型)(入门级小白一看就懂)
- 乔纳森·詹姆斯,世界五大顶尖黑客之一
- string C语言 什么意思,includestring.h是什么意思
热门文章
- 【浙大版《Python 程序设计》题目集(解)】第2章-3 阶梯电价(15分)
- 一个vue组件完成的音乐播放器
- php recordset count record,RecordSet 游标的使用
- 控制器瘦身及tableView相关
- 林世霖. linux环境编程图文指南,linux环境编程图文指南
- Android学习笔记(三)Application类简介
- Boostrap视频教程-李炎恢-专题视频课程
- CSS 如何使用 text-shadow 和 box-shadow 阴影效果
- SpringBoot整合Dubbo报错: java.lang.ClassCastException
- mysql etl过程_ETL处理过程