395. 至少有 K 个重复字符的最长子串
class Solution:
def longestSubstring(self, s: str, k: int) -> int:
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)
# 递归的终止条件(能直接写出的最简单 case):如果字符串 s 的长度少于 kk,那么一定不存在满足题意的子字符串,返回 0;
# 调用递归(重点):如果一个字符 cc 在 s 中出现的次数少于 kk 次,那么 s 中所有的包含 cc 的子字符串都不能满足题意。所以,应该在 s 的所有不包含 cc 的子字符串中继续寻找结果:把 s 按照 cc 分割(分割后每个子串都不包含 cc),得到很多子字符串 t;下一步要求 t 作为源字符串的时候,它的最长的满足题意的子字符串长度(到现在为止,我们把大问题分割为了小问题(s → t))。
# 未进入递归时的返回结果:如果 s 中的每个字符出现的次数都大于 kk 次,那么 s 就是我们要求的字符串,直接返回该字符串的长度。