今天刷力扣发现一道有趣的题,这道题目很普通,但是解法确可以偷懒
原题链接:力扣459:重复的子字符串
题目
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba" 输出: false
示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
1 <= s.length <= 104
s
由小写英文字母组成
Related Topics
个人解法
想法:既然要判断字符串是否由一个子串重复多次构成,那么如果结果是肯定的,这个字符串的长
度一定能够整除子串的长度。
所以我首先做一个循环,找到可能作为子串重复的字符串,在其基础上判断是否满足,循环结束
后都没有找到满足的,那么结果肯定就是false了。
接下来我们考虑循环内部的逻辑,如果一个子串可以满足子串重复多次组成当前的字符串,那么按
照子串的长度分割,每一部分都是相同的。接下来就是重点了!!!重点!!!怎么判断这些部分
都相同??
假设满足条件:
s = "abdfs"
parent = s1+s2+s3+s4+....sn(s1...sn都是s)
根据上面的字符串以及子串作说明
可以分为两步判断:
s = "abdfs"
parent = s1+s2+s3+s4+....sn(s1...sn都是s)
根据上面的字符串以及子串作说明
可以分为两步判断:
- s1和sn相同
- s2s3s4...sn和s1s2s3....s(n-1)相同
{% tabs categories%}
class Solution {
public boolean repeatedSubstringPattern(String s) {
int lens = s.length();
for (int i = 1; i < lens; i++) {
if (lens % i == 0) {
if (s.substring(0, i).equals(s.substring(lens - i))
&& s.substring(i).equals(s.substring(0, lens - i))) {
return true;
}
}
}
return false;
}
}
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
for i in range(1, len(s)):
if len(s) % i == 0:
if s[0:i] == s[len(s)-i:len(s)] and s[0:len(s)-i] == s[i:len(s)]:
return True
return False
{% endtabs %}