持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一个非空的字符串 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)