示例:输入abcabcabc,此时最小的子串是abc,长度为3,输出3.
直接给出代码进行讲解
import java.util.Scanner;
public class minstring {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String content=in.next();
int length=content.length();
boolean judge=false;
//字符串转换为字符数组
char[] test=content.toCharArray();
for(int i=1;i<length;i++) {
int ok=1;
for(int j=i;j<length;j++) {
if(test[j]!=test[j%i]) {ok=0;break;}
}
if(ok==1) { System.out.println(i); judge=true;break;}
}
if(!judge) {System.out.println(length);}
}
}
思考:因为要求出最小的子串,那么最小就可能是1,然后再逐渐增大测试。由此考虑使用一个变量来记录字串长度(即代码中的i从1测试到length-1)。
然后对代码块关于j的for循环原理:
for(int j=i;j<length;j++) {
if(test[j]!=test[j%i]) {ok=0;break;}
}
用上面数组[a,b,c,a,b,c,a,b,c]来讲解:
j%i的目的在于使得始终在子串长度0-i-1进行遍历
[a(0), b(1), c(2)
a(3,3%3=0),b(4,4%3=1),c(5,5%3=2)
a(6,6%3=0),b(7,7%3=1),c(8,8%3=2)]
当i=1时相当于此时考虑子串是[a]。循环j=1,j%i=0,test[1]!=test[0]成立,则不正确。
i=2同理
i=3时,考虑子串是[a,b,c].循环j=3,j%3=0,test[3]=test[0];j=4,j%3=1,test[4]=test[1]…j=8,test[8]=test[2]此时遍历完了字符串,所以最小子串是[a,b,c]