题目描述:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。
示例 1:
输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。
示例 2:
输入: “aba”
输出: False
示例 3:
输入: “abcabcabcabc”
输出: True
解析:
1.去头加去尾拼接
①去除输入字符串的头字符拼接一个去除尾字符的字符串;
②判断拼接后的字符串中是否还含有原字符
public boolean repeatedSubstringPattern(String str){
//判读输入合法性
if (str == null || str.length() == 0)
return false;
//将str去头与str去尾拼接起来
StringBuilder sb = new StringBuilder();
sb.append(str.substring(1, str.length()));
sb.append(str.substring(0, str.length()-1));
//判断拼接后的字符串是否含有str
//abcabc-->拼接后-->bcabcabcab
if (sb.toString().contains(str))
return true;
return false;
}
2.等份相加(时间复杂度过高)
①将字符串拆成2~str.length()份;
②每拆一次,均取出第0份,重复拼接该份字符串;
③如果拼接后的字符串等于原字符串,则返回true,否则返回false。
public boolean repeatedSubstringPattern2(String str){
//判读输入合法性
if (str == null || str.length() == 0)
return false;
//将字符串拆成i份,从2到str.length()
for (int i = 2; i <= str.length(); i++){
//将第一份作为子串重复拼接i份
StringBuilder sb = new StringBuilder();
for (int j = 0; j < i; j++){
sb.append(str.substring(0, str.length()/i));
}
//如果拼接后的字符串等于str,则返回true
if (sb.toString().equals(str))
return true;
}
return false;
}