459.重复的子字符串
问题:
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
思路:
暴力枚举:枚举可能的子字符串,满足题目要求的子字符串有4个特征:
-
子字符串的长度不会大于父字符串s长度的一半。
-
子字符串一定是父字符串s的前缀;
-
父字符串s的长度n一定是子字符串长度n’的倍数;
-
从子字符串的后一位开始,往后遍历每个子字符串长度中的每一位都应该与子字符串对应相同。
代码实现:
class Solution {
public boolean repeatedSubstringPattern(String s) {
int len = s.length();
//标记子字符串是否满足题意
boolean flag = false;
//1.子字符串必定不大于s的一半
//2.枚举子字符串为索引0 ~ (i-1)
for (int i = 1; i * 2 <= len; i++) {
//3.s长度一定是子字符串长度的倍数
if (len % i == 0) {
flag = true;
//4.子字符串后元素与其减去子子字符串长度索引处元素一定相等
//只要有一个字符不满足就修改flag为false
for (int j = i; j < len; j++) {
if (s.charAt(j) != s.charAt(j - i)) {
flag = false;
break;
}
}
}
//对每个可能的子字符串都判断flag
if (flag)
return true;
}
return false;
}
}
时间复杂度O(n²):两层循环
空间复杂度O(1):原地遍历