给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。
示例 2:
输入: “aba”
输出: False
示例 3:
输入: “abcabcabcabc”
输出: True
解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)
解题思路:字符串是由重复子串构成,说明重复子串的length必定小于等于源字符串的一半,还有就是s.length() % length == 0。所以,把子串的长度初始化为s.length()/2,然后循环判断。
时间复杂度为:O(n)
代码如下:
class Solution {
public boolean repeatedSubstringPattern(String s) {
// 判断鲁棒性
if (s == null || s.length() <= 1) {
return false;
}
int length = s.length();
// 循环判断
for (int i = length/2; i > 0; i--) {
// 判断是否满足重复子串
if (length % i == 0) {
StringBuilder sb = new StringBuilder();
// 得到重复子串的个数
int c = length / i;
String temp = s.substring(0, i);
for (int j = 0; j < c; j++) {
// 利用StringBuilder 拼接
sb.append(temp);
}
if (sb.toString().equals(s)) {
return true;
}
}
}
return false;
}
}
通过率如下: