题目:求字符串的最小周期(三种解法)
程序代码:
import java.util.Scanner;
public class PeriodicStrings {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String words = sc.nextLine();
f1(words);
f2(words);
f3(words);
}
}
//采用数学的方法,判断s[j]==s[j%T]
public static void f1(String s) {
char[] c_s = s.toCharArray();//转成字符数组
boolean isok = true;
int t = 1;
for(t=1;t<=c_s.length;t++) {
if(c_s.length%t==0) {//周期串c_s的长度是周期t的倍数
isok = true;//假定当前周期t是最小周期
for(int start=t;start<c_s.length;start++) {
if(c_s[start]!=c_s[start%t]) {
isok = false;
break;
}
}
if(isok==true) {//假设周期为t全部检测完成
break;
}
}
}
System.out.println(t);
}
//采用长度扩展两倍进行字符比较的方法
public static void f2(String s) {
String s2 = s+s;//扩展到两倍,方便取长度为s.length()子串
int t=1;//不能从0开始
for(t=1;t<=s.length();t++) {
if(s.length()%t!=0) continue;
String s3 = s2.substring(t,t+s.length());
if(s3.equals(s)) break;
}
System.out.println(t);
}
//采用空字符替换的方法
public static void f3(String s) {
int t = 1;
for(t=1;t<=s.length();t++) {
if(s.length()%t==0) {
String sub = s.substring(0,t);
if(s.replace(sub, "").length()==0) {
System.out.println(t);
break;
}
}
}
}
}