【力扣·重复的子字符串】Python解法

本文讲述了作者在解决字符串中是否存在重复子串问题时,从初始的暴力遍历到最终采用巧妙的字符位置计数法,降低时间复杂度的过程。关键改进在于找到子串长度的规律,通过减少循环次数成功通过了题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:这道题其实很简单,但我还是用了很久,主要问题就是超时。

我最开始是遍历整个字符串长度然后每次增加一个字符长度截取,然后将两个字符串set成集合,当两个集合相等且原始字符串长度是子串的倍数且不为一倍且子串在原始字符串除子串外部分中时,若子串乘以n倍与原始相等,就将flag置为1。然后就超时了。

之后,我将遍历长度改为字符串长度一半,还是超时。

最后,我求出字符串首字母在[1:len(s)/2]中的数量num,然后循环num+2次(要加上首字母的一次和恰好中间之后一个就是的情况),接着每次循环中求出字符的位置,让子串增加相应的长度,这样耗时就大大减少了,也就通过啦!

原题如下:

 

通过代码如下:

class Solution(object):
    def repeatedSubstringPattern(self, s):
        """
        :type s: str
        :rtype: bool
        """
        flag = 0
        num =  s[1:len(s)/2].count(s[0])
        s1 = ""
        n = 0
        for i in range(num+1+1):
            k = s[1:].find(s[0])
            if k == -1:
                break
            n = len(s1) + s[n+1:].find(s[0]) + 1
            s1 = s[:n]
            ss = s[n:]
            s2 = set(s)
            s3 = set(s1)
            if len(s) == 1 or len(s2) == len(s):
                break
            a = len(s) % len(s1)
            b = len(s) / len(s1)
            if (s2 == s3) and (a == 0) and (b != 1) and (s1 in ss):
                s11 = s1 + ((b-1)*s1)
                if s == s11:
                    flag = 1
            if flag == 1:
                break
        if flag == 0:
            return False
        else:
            return True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值