459. 重复子字符串(Python)

题目

难度:★☆☆☆☆
类型:数组

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例

示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。

示例 2:
输入: "aba"
输出: False

示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

解答

这里我们观察到一个现象,对于一个字符串s,我们将两个该字符串连接成一个更长的字符串(s_double),该字符串中至少包含两个s子串,如果s可以由多个重复单元构成,那么合并后的字符串中一定包含超过两个s子串(可重叠),例如,两个"abab"组成的"abababab"中包含3个"abab",而两个"aba"组成的"abaaba"则只包含两个"aba",根据这个原理,我们只需要统计s+s中s(可重叠)出现的次数,并与2比较即可。

这里为了简化计算,我们把s+s的首尾两端字符去掉,这样就只需要查看s是否在剩余的字符串中即可。编码时通过索引范围[1:len(s)*2-1]起到去掉首尾两端字符的效果。

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return s in (s+s)[1:len(s)*2-1]

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(459. 重复子字符串(Python))