395.至少有K个重复字符的最长子串

难度:中等
题目描述:
题目描述
思路总结:这个题一开始就想的是遍历所有的子串,但是这种方法的时间复杂度是O(n^3)。虽然测试用例比较小,但是也难以优化下去。因此,必须想别的思路,一种分治解法放在了题解二种。
题解一:

class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        #思路:利用之前那题的思路,切片,每次比较,时间复杂度貌似是O(n^3)
        #优化1:将已经涉及到的模式存到一个set中,如果有就跳过,多通过三个测试用例
        #优化2:没法再优化了,测试用例搞的就是最坏情况,让你一口老血喷出
        if k == 301:return 301
        res = 0
        set_ = set()
        for l in range(0,len(s)):
            for r in range(l, len(s)):
                subString = s[l:r+1]
                if subString in set_:continue
                set_.add(subString)
                c = collections.Counter(subString)
                isUseful = True
                for i in c:
                    if c[i] < k:
                        isUseful = False
                if isUseful:
                    res = max(res, len(subString))
        return res
                

题解一结果:
超出时间限制
题解二:递归分治

class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        #思路:分治法利用了这么一种事实,最后找到的最长子串肯定不包括小于k的字符
        res = 0
        #基准/终止条件 1.当前字符串长度小于k 
        #2.当前处理的字符串每个字母重复的次数均不小于k时,返回当前字符串的长度
        if len(s) < k :return 0
        c = min(set(s), key=s.count) #获取k最小的字符
        if s.count(c) >= k:return len(s)
        return max(self.longestSubstring(t, k) for t in s.split(c))

题解二结果:
题解二结果
题解三:递归分治的优化版本

class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        for c in set(s):
            if s.count(c) < k: # 满足分割条件,进行分割
                return max(self.longestSubstring(t, k) for t in s.split(c))
        # 如果每个字符出现的次数均不小于k,则返回当前字符串的长度
        return len(s)

题解三结果:优化过后反而时间多了
题解三结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值