思路:这道题其实很简单,但我还是用了很久,主要问题就是超时。
我最开始是遍历整个字符串长度然后每次增加一个字符长度截取,然后将两个字符串set成集合,当两个集合相等且原始字符串长度是子串的倍数且不为一倍且子串在原始字符串除子串外部分中时,若子串乘以n倍与原始相等,就将flag置为1。然后就超时了。
之后,我将遍历长度改为字符串长度一半,还是超时。
最后,我求出字符串首字母在[1:len(s)/2]中的数量num,然后循环num+2次(要加上首字母的一次和恰好中间之后一个就是的情况),接着每次循环中求出字符的位置,让子串增加相应的长度,这样耗时就大大减少了,也就通过啦!
原题如下:
通过代码如下:
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
flag = 0
num = s[1:len(s)/2].count(s[0])
s1 = ""
n = 0
for i in range(num+1+1):
k = s[1:].find(s[0])
if k == -1:
break
n = len(s1) + s[n+1:].find(s[0]) + 1
s1 = s[:n]
ss = s[n:]
s2 = set(s)
s3 = set(s1)
if len(s) == 1 or len(s2) == len(s):
break
a = len(s) % len(s1)
b = len(s) / len(s1)
if (s2 == s3) and (a == 0) and (b != 1) and (s1 in ss):
s11 = s1 + ((b-1)*s1)
if s == s11:
flag = 1
if flag == 1:
break
if flag == 0:
return False
else:
return True