4.7重复的子字符串(LC_459-E)

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

示例 1:

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

示例 2:

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

示例 3:

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

所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。

当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

举个例子来说明为什么去掉首尾字符后能够有效检测重复子串:

  • 设 s = "abab"

    • (s + s) = "abababab"
    • 去掉首尾字符得到 "bababa"
    • 在 "bababa" 中我们可以找到 "abab",这说明 s 是由子串 "ab" 重复两次构成的。
  • 设 s = "aba"

    • (s + s) = "abaaba"
    • 去掉首尾字符得到 "baab"
    • "aba" 并不在 "baab" 中,说明 s 不是由某个子串重复构成的。

正确代码:

class Solution(object):
    def repeatedSubstringPattern(self, s):
        """
        :type s: str
        :rtype: bool
        """
        return True if s in (s+s)[1:-1] else False

1. 字符串拼接 s + s

  • s + s 是将字符串 s 与自身拼接,生成一个新的字符串。
  • 例如,假设 s = "abc",那么 s + s 就是 "abcabc"

2. 字符串切片 [1:-1]

  • 切片语法 [start:end] 用于从一个字符串中提取部分内容,其中 start 是起始索引,end 是结束索引。

    • start 是从哪里开始切,索引从0开始。
    • end 是在哪里结束切片,但不包括 end 索引对应的字符。
  • 如果 start 或 end 是负数,Python 则从字符串的末尾倒数进行索引:

    • -1 表示最后一个字符,-2 表示倒数第二个字符,以此类推。
  • [1:-1] 表示从索引 1 开始,一直到倒数第二个字符为止(不包括最后一个字符)的所有字符:

    • 对于 s = "abcabc"s[1:-1] 就是 "bcab"

时间空间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值