2020/3/26 打卡
题目
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。 示例 1: 输入:s = "aaabb", k = 3 输出:3 最长子串为 "aaa" ,其中 'a' 重复了 3 次。 示例 2: 输入:s = "ababbc", k = 2 输出:5 最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。 解释: 因为需要最长的字串,而c是不够的,所以就是除了c之外的长度就是 最长的字串长度。
思路
这里的问题 在于找到最长的字串。 一种其妙的思路就是 针对 要求T中的每一字符出现次数都不少于 k 的特性,我们 可以首先找到出现次数小于k的字母。 然后 根据该字母进行 字符串的切分, 进行切分后,进行分治方式的 计算寻找最长满足条件子串的长度。
代码
class Solution(object):
def longestSubstring(self, s, k):
# 如果s为空字符长,那么返回长度0
if not s:
return 0
# 对于每个字符做出处理
for c in set(s):
#(核心也比较好理解的一句话) 如果字符串中存在数量小于k的字符,那么该字符串必不合格,按照个数小于k的字符划分字符串,对划分的字符串继续递归判断
if s.count(c) < k:
# 进行分治处理吧,根据这个字符c进行切分多个部分,分别计算出 各部分 目标最长字串长度,然后从中再往上统计。
return max(self.longestSubstring(t, k) for t in s.split(c))
# 如果s中所有字符个数都大于k,返回s的长度
return len(s)