Skip to the content.

leetcode [395] 至少有K个重复字符的最长子串


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

最长子串为 "aaa" ,其中 'a' 重复了 3 次。

示例 2:

输入:
s = "ababbc", k = 2

输出:
5

最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

来自题解:

递归的两个条件

基线条件

递归条件

当前处理的字符出现的次数小于k,以当前字符为分隔符切割当前字符串,对切割好的子字符串依次调用函数本身

更新条件

递归会把字符串s一次次的切分,直到出现s.count(c) >= k或len(s) < k的情况,而每次由大到小的切分,都可能出现满足类型2的s2字符串出现。 那么动态规划部分要做的就是,与历史最长的s2长度比较,然后更新,直到迭代完整个字符串

结果:max([len(s2) for s2 in s2_list])

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)