题目描述
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
- 示例1
输入: "abab"
输出: True
解释: 可由子字符串"ab"重复两次构成。
- 示例2
输入: "aba"
输出: False
- 示例3
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串"abc"重复四次构成。(或者字符串"abcabc"重复两次构成。)
设置标志位
设置标志位flag控制子字符串是否重复构成,同时相应的变化游标长度使得实现重复构成。
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
factor = s[0]
si, flag = 1, False
while si < len(s):
step = len(factor)
if not flag:
if si > len(s)//2:
return False
if s[si:si+step] == factor:
flag = True
si += step
else:
factor = s[:si+1]
si += 1
else:
if s[si:si+step] != factor:
flag = False
factor = s[:si-step+1]
si = si - step + 1
else:
si += step
return flag
找规律
如果能重复构成,不论构成多少次,一个字符串都会在去除第一个元素和最后一个元素的叠加两次字符串中出现。
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
return s in (s+s)[1:len(s)*2-1]
(最近更新:2019年05月15日)