给定一个非空的字符串 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"
。
- 对于