Leetcode Link: 395. 至少有 K 个重复字符的最长子串 - 力扣(LeetCode)

题目

解法一

思路: 分治

假设这样一种情况:我们发现其中一个字符 c 在字符串 s 中的个数不足 k 个,可以怎么做?

我们可以将字符串 s 以 c 为分界分隔成若干个子字符串,然后就变成了子问题,可以递归完成。

那我们什么时候可以停止递归? 显然,当当前字符串的长度小于k,一定不能满足题目要求了,因此返回0。

题解

class Solution(object):
    def longestSubstring(self, s, k):
	    # base case
        if len(s) < k:
            return 0
        # 找子问题并分治递归
        for c in set(s):
            if s.count(c) < k:
                return max(self.longestSubstring(t, k) for t in s.split(c))
        return len(s)

解法二

思路【宫水三叶の相信科学系列】为什么不能用「滑动窗口」?以及如何发掘题目性质 - 至少有 K 个重复字符的最长子串 - 力扣(LeetCode)

题解

解法三

思路

题解

启发和联系

类似问题无重复字符串的最长子串