算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)
目录
1 问题描述
我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
例如:
字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
2 解决方案
2.1 第一印象解法(80分)
初步看到此题,第一印象就是字符串模式匹配,那么遇到此问题,最佳的时间效率当然是使用KMP字符串模式匹配算法啦,结果运行测评分数为80分,原因:运行超时。

以下代码仅供参考哦。
具体代码如下:
import java.util.Scanner;
public class Main {
public int[] getNext(char[] arrayB) {
int[] next = new int[arrayB.length + 1];
int j = 0;
for(int i = 0;i < arrayB.length;i++) {
while(j > 0 && arrayB[i] != arrayB[j])
j = next[j];
if(arrayB[j] == arrayB[i])
j++;
next[i + 1] = j;
}
return next;
}
public int getKMP(char[] arrayA, char[] arrayB) {
int max = 0; //统计arrayB在arrayA中匹配子串的总个数
int[] next = getNext(arrayB);
int j = 0;
int tempi = -1; //记录每一次匹配完成时i的值
for(int i = 0;i < arrayA.length;i++) {
while(j > 0 && arrayA[i] != arrayB[j])
j = next[j];
if(arrayA[i] == arrayB[j])
j++;
if(j == arrayB.length) {
if(i - tempi != arrayB.length) //针对题意运行时间要求,做出此处判定
break;
tempi = i; //更新tempi值
max++;
j = 0;
}
}
return max;
}
public void printResult(String A) {
char[] arrayA = A.toCharArray();
int max = arrayA.length;
for(int i = 0;i < arrayA.length;i++) {
int len = i + 1;
if(len > arrayA.length / 2)
break;
else if(arrayA.length % len != 0)
continue;
char[] arrayB = new char[len];
for(int j = 0;j < arrayB.length;j++)
arrayB[j] = arrayA[j];
int tempMax = arrayA.length / arrayB.length;
if(tempMax == getKMP(arrayA, arrayB)) { //当匹配字符串arrayB刚好组成arrayA时
max = arrayB.length;
break;
}
}
System.out.println(max);
return;
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
String A = in.next();
test.printResult(A);
}
}
2.2 借鉴网友解法(100分)


具体代码如下:
import java.util.Scanner;
public class Main {
public void printResult1(String A) {
char[] arrayA = A.toCharArray();
int max = arrayA.length;
for(int i = 0;i < arrayA.length;i++) {
int k = i + 1;
if(k > arrayA.length / 2)
break;
else if(arrayA.length % k != 0)
continue;
int j = k;
for(;j < arrayA.length;j++) {
if(arrayA[j] != arrayA[j % k])
break;
}
if(j == arrayA.length) {
max = k;
break;
}
}
System.out.println(max);
return;
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
String A = in.next();
test.printResult1(A);
}
}
参考资料:
算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)的更多相关文章
- 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...
- 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...
- 算法笔记_091:蓝桥杯练习 递推求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...
- 算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 递推法 1 问题描述 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰 ...
- 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- 算法笔记_081:蓝桥杯练习 算法提高 矩阵乘法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最 ...
- 算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)
目录 1问题描述 2 解决方案 1 问题描述 问题描述 "嘟嘟嘟嘟嘟嘟 喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙" 这是儿歌“快乐的小司机”.话说现在当司机光 ...
- 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...
随机推荐
- HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】
Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the n ...
- PAT 1131. Subway Map (30)
最短路. 记录一下到某个点,最后是哪辆车乘到的最短距离.换乘次数以及从哪个位置推过来的,可以开$map$记录一下. #include<map> #include<set> #i ...
- [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- Alpha冲刺(6/10)——追光的人
1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...
- 简单理解SNAT回流中的概念:路由器怎么知道外网返回的数据是局域网中哪台主机的
内网到外网用的是NAT技术(地址封装)外网到内网用的是端口映射(PNAT)计算机的端口又65535(0-65534),你说的那些有名气的端口大多都是0-1023之间的你说的这个问题很简单,但首先你要懂 ...
- mysql错误 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)
mysql -u root -p Aaa111222333 grant all privileges on *.* to root@'%' identified by 'aaa111222333; Q ...
- subline text 常用插件
C语言 Alignment c Improved cool format doc Blocker cTags AllAutoComplete wakatime 精确统计你再 ...
- TSQLTableJSON解析JSON
TSQLTableJSON解析JSON uses mormot rocedure TTestTableContent.SynopseTableVariant;var json: RawUTF8; pe ...
- Oracle Form删除list项
Oracle From中的list项点击后就会新增一个下拉列,此时可以使用 Ctrl+shift+< 进行删除
- 网络上的等待事件 —— SQL*Net message from client/dblink
SQL*Net message from client SQL> select event#,name,parameter1,parameter2,parameter3 from v$event ...