java实现周期串
题目
A character string is said to have period k if it can be formed by concatenating one or more repetitions
of another string of length k. For example, the string ”abcabcabcabc” has period 3, since it is formed
by 4 repetitions of the string ”abc”. It also has periods 6 (two repetitions of ”abcabc”) and 12 (one
repetition of ”abcabcabcabc”).
Write a program to read a character string and determine its smallest period.
Input
The first line oif the input file will contain a single integer N indicating how many test case that your
program will test followed by a blank line. Each test case will contain a single character string of up
to 80 non-blank characters. Two consecutive input will separated by a blank line.
Output
An integer denoting the smallest period of the input string for each input. Two consecutive output are
separated by a blank line.
Sample Input
1
HoHoHo
Sample Output
2
大意就是要你输入多组数据,之后结果最后一行就要在输出一个空行
思路
一下代码解释是提交错误十几次得出的经验
因为这个字符串如果是周期变化的,肯定在循环的某一时刻,字符串总长度时可以整除那个周期串的,所以这就是我们可能判断的条件
package PeriodStrings;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner in=new Scanner(System.in);
int T=in.nextInt();
while(T-->0) {
boolean flag=false; //输入的字符串只有一个字符,不会进入循环,直接让他进入最后的输出
String a=in.next(); //读取输入的字符串
int length=a.length();
for(int i=1;i<=length/2;i++) {
if(length%i==0) { //可能出现最小周期串
flag=true; //为了后面循环里面的判断设定的,不放在前面判断语句的前面是为了减少不能整除的时候flag会被变成true,导致最后不满足情况却不输出语句的原因
String b1=a.substring(0,i); //取前面可以整除的字符串
for(int k=i;k+i<=length;k+=i) {
String b2=a.substring(k,k+i); //取和b1相同长度的字符串
if(!(b1.equals(b2))) { //如果取得不相等
flag=false;
break;
}
}
if(flag) {
System.out.println(i);
break;
}
}
}
if(!flag) {
System.out.println(length);
}
if(T>=1) {
System.out.println();
}
}
}
}