Q:
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。示例 2:
输入: "aba" 输出: False思路1:使用KMP算法,返回的条件是 p 为next [-1] p > 0 and size % (size - p) 代码如下:
class Solution: def repeatedSubstringPattern(self, s): """ :type s: str :rtype: bool """ size = len(s) next = [0] * size for i in range(1, size): k = next[i - 1] while s[i] != s[k] and k: k = next[k - 1] if s[i] == s[k]: next[i] = k + 1 p = next[-1] return p > 0 and size % (size - p) == 0
思路2:
如果字符串重复的,那么同一个字符串相加之后,内部必然会有重复,如abab 相加后为 abababab 字符串存在于[-1:1]区间内
如果是本身不是重复的字符串 如aba 那么相加后为abaaba 在区间[-1:1]内不存在原子串,代码如下:
class Solution: def repeatedSubstringPattern(self, s): """ :type s: str :rtype: bool """ return s in (s*2)[1:-1]