给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
例:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
解析:
先进行遍历,先判断单个重复的情况。然后是多个字符重复,先对是否是子串的倍数进行筛选,然后以子串长度为滑动窗口进行向后比较即可。
class Solution {
public boolean repeatedSubstringPattern(String s) {
for (int i = 1; i <= s.length()/2; i++){
boolean flag = true; // 标识
if(i == 1){ // 单个重复的情况
for(int j = 1; j< s.length(); j++){ // 对每个字符都进行比较
if(s.charAt(j) != s.charAt(0)){ // 遇到不相同的字符
flag = false; // 标记一下
break; // 直接退出循环
}
}
if (flag) return true; // 返回结果
}else{
if(s.length() % i != 0) continue; // i为滑动窗口长度
int left = i; // 滑动窗口左侧
int right = 2 * i - 1; // 滑动窗口右侧
while(right <= s.length()){ // 滑动截止条件
if(!s.substring(left, right+1).equals(s.substring(0,i))){ // 子串对比
flag = false; // 不相同标记为false
break; // 直接跳出
}
left += i; // 窗口滑动
right += i;
}
if(flag) return true; // 返回结果
}
}
return false; // 返回结果
}
}