题目描述
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母。
例1
输入: "abcabc"
输出: True
解释: 可由子字符串 "abc" 重复两次构成。
例2
输入: "abac"
输出: False
解释:字符串不是由子字符串重复多次构成的。
例3
输入: "abababab"
输出: True
解释: 可由子字符串 "ab" 重复四次构成。 (或者子字符串 "abab" 重复两次构成。)
解题思想一
如果一个字符串 s 是由子字符串重复构成的,他首先满足两个条件:(1)子字符串的长度小于 s 的长度;(2)s 的长度除以子字符串的长度是一个整数。
根据以上两个条件分割字符串,然后判断分割后的子字符串是否相同,相同则返回true,否则说明字符串 s 不是由子字符串重复构成的。
代码一
/**
* 判断一个字符串是否是由子字符串重复构成的
* @author dxt
*
*/
public class Test01 {
/**
* 判断字符串s是否是由子字符串重复构成的
* @param s
* @return
*/
public static boolean repeatedSubstringPattern(String s) {
//只有一个字符
if(s.length() <= 1){
return false;
}
int parts = 1; //字符串子串的重复次数
int len = s.length();
//重复的次数小于s.length()
while(parts < len){
//字符串长度是 重复子串 长度的正数倍
if(len%(parts+1) == 0){
//已满足重复的条件,判断是否重复
boolean repeat = true; //假设字符串就是重复的
int part_len = len / (parts+1);//子串的长度
for(int i=1; i<=parts; i++){
for(int j=0; j<part_len; j++){
if(s.charAt(j) != s.charAt(j+i*part_len)){
repeat = false; //不重复,退出循环
break;
}
}
//如果不重复,退出 判断是否重复 的这段程序
if(!repeat){
break;
}
}
//如果重复,返回true
if(repeat){
return true;
}
}
parts++;
}
//没有在前面判断出重复,则返回false
return false;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String str = "abababa";
System.out.println(repeatedSubstringPattern(str));
}
}