日新计划Leetcode之 459. 重复的子字符串

75 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

一、题目描述:

459. 重复的子字符串 - 力扣(LeetCode)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 10^4
  • s 由小写英文字母组成

二、思路分析:

可以肯定的规则有以下两条:

  • 基本字符串p一定是从s开头的字符串
  • p在s中至少重复一次即pp 考虑复杂一点的情况,基本字符串应该包含多个字母,在这些字母中,我们以最远的那个字母的索引作为匹配指针的开始,直到整个字符串一半的结尾停止。

值得注意的是,这里while循环满足的条件实际上一语双关了

第一层意思:
假定s= 'abaaabaa',则匹配指针应该从索引1处开始,到索引3处结束

第二层意思:
假定s = 'ababc',此时的匹配指针从c开始了,不满足匹配指针的边界条件,故直接返回Fasle

三、AC 代码:

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:

        
        pIdx = max(s.index(i) for i in set(s))
        while pIdx <= len(s) / 2 - 1:
            basicStr = s[:pIdx+1]
            if not any(s.split(basicStr)):
                return True
            pIdx += 1
        return False

范文参考

炎2索尔:一图看懂 return (s + s).find(s, 1) != s.size(); - 重复的子字符串 - 力扣(LeetCode)

子串重复多次构成,拼接一次,看是否本字符串在拼接字符串中出现 - 重复的子字符串 - 力扣(LeetCode)

Java 比较字符子串,简单易懂! - 重复的子字符串 - 力扣(LeetCode)