给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba" 输出: false
示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
举个例子来说明为什么去掉首尾字符后能够有效检测重复子串:
-
设
s = "abab":(s + s)="abababab"。- 去掉首尾字符得到
"bababa"。 - 在
"bababa"中我们可以找到"abab",这说明s是由子串"ab"重复两次构成的。
-
设
s = "aba":(s + s)="abaaba"。- 去掉首尾字符得到
"baab"。 "aba"并不在"baab"中,说明s不是由某个子串重复构成的。
正确代码:
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
return True if s in (s+s)[1:-1] else False
1. 字符串拼接 s + s
s + s是将字符串s与自身拼接,生成一个新的字符串。- 例如,假设
s = "abc",那么s + s就是"abcabc"。
2. 字符串切片 [1:-1]
-
切片语法
[start:end]用于从一个字符串中提取部分内容,其中start是起始索引,end是结束索引。start是从哪里开始切,索引从0开始。end是在哪里结束切片,但不包括end索引对应的字符。
-
如果
start或end是负数,Python 则从字符串的末尾倒数进行索引:-1表示最后一个字符,-2表示倒数第二个字符,以此类推。
-
[1:-1]表示从索引1开始,一直到倒数第二个字符为止(不包括最后一个字符)的所有字符:- 对于
s = "abcabc",s[1:-1]就是"bcab"。
- 对于
时间空间复杂度






![前端常见**MS题 [3]](https://i-blog.csdnimg.cn/direct/4ca9967122164e87ac16583f8d990174.png)














