问题描述
找到给定字符串(由小写字符组成)中的最长子串 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次的作为分界点进行切割,然后将得到的新字符串继续判断,知道新字符串中所有字母的出现次数都为k次,输出字符串长度
class Solution:
def longestSubstring(self, s: str, k: int) -> int:
if len(s) < k:
return 0
else:
for i in set(s):
if s.count(i) < k:
return max((self.longestSubstring(j, k)) for j in s.split(i))
return len(s)
滑动窗口
class Solution:
def longestSubstring(self, s: str, k: int) -> int:
n = len(s)
if n == 0:
return 0
res = 0
for t in range(1, 27):
left = 0
c_num = 0
k_num = 0
record = [0 for _ in range(26)]
for j in range(n):
c_ord = ord(s[j]) - ord("a")
record[c_ord] += 1
if record[c_ord] == 1:
c_num += 1
if record[c_ord] == k:
k_num += 1
while left < j and c_num > t:
del_ord = ord(s[left]) - ord("a")
if record[del_ord] == 1:
c_num -= 1
if record[del_ord] == k:
k_num -= 1
record[del_ord] -= 1
left += 1
if c_num == k_num == t:
res = max(res, j - left + 1)
return res