题目:
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3输出:
3最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2输出:
5最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
方法一:
一个字符串队列str_list记录子串,一个字典队列str_counting_list记录子串的频次。
- 首先统计整个字符串的频次,将字符串和字符串频次字典分别加入str_list和str_counting_list;
- 分别从两个队列中读取数据,利用其对应字典记录字符串的频次去分割当前字符串,判断分割出来的子串是否是满足条件的子串,如果满足条件则尝试更新最长长度,不满足条件则加入队列中;
- 重复第二步过程,直到队列为空;
- 注:通过长度剔除掉不符合条件的子串,可以减少计算时间。
class Solution:
def isSubstring(self, counting, k):
for key in counting:
if counting[key]<k:
return False
return True
def longestSubstring(self, s: str, k: int) -> int:
counting = {}
for i in s:
if i in counting:
counting[i]+=1
else:
counting[i]=1
longestlength = 0
str_list = [s]
substr_counting_list = [counting]
while(str_list):
# print(str_list, substr_counting_list)
substr = ''
substr_counting = {}
s = str_list.pop(0)
counting = substr_counting_list.pop(0)
if len(s)<=longestlength:
continue
for i in range(len(s)):
if s[i] in substr_counting and substr_counting[s[i]]+counting[s[i]]>=k:
substr += s[i]
substr_counting[s[i]]+=1
counting[s[i]] -= 1
elif counting[s[i]]>=k:
substr += s[i]
substr_counting[s[i]] = 1
counting[s[i]] -= 1
else:
if len(substr)>longestlength:
if self.isSubstring(substr_counting, k):
longestlength = max(longestlength, len(substr))
else:
str_list.append(substr)
substr_counting_list.append(substr_counting)
substr = ''
substr_counting = {}
if len(substr)>longestlength:
if self.isSubstring(substr_counting, k):
longestlength = max(longestlength, len(substr))
else:
str_list.append(substr)
substr_counting_list.append(substr_counting)
return longestlength