题解 | #至多包含K种字符的子串#
至多包含K种字符的子串
https://www.nowcoder.com/practice/04c926ef687340c3842a72edb5c23ede
解题思路:
1、使用前后两个指针,移动后指针遍历字符串,把每个字符出现的位置创建为列表,并存入字典;使用res记录结果,初始值为0;
2、后指针对应字符在字典中,或字典中的字符种类没有超过k种,则直接把索引存入字典;
3、如果对应字符不在字典中,且字典中字符种类等于k种,则记录当前子串大小并更新res;
寻找可以减少子串中一种字符且前指针移动最短的位置,即找到字典中各字符对应列表的最大值最小的一个字符,把前指针移动到该字符最后一次出现的下一个位置,并删除字典中该字符对应的键值对;
4、后指针移动到最后一个位置后,再更新一次res。
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param s string字符串 # @param k int整型 # @return int整型 # class Solution: def getRes(self,start,end,res): if end - start > res: res = end - start return res def getSmallerItem(self,nums): keys_list = list(nums.keys()) print(keys_list) res = keys_list[0] for i in keys_list: if max(nums[i]) < max(nums[res]): res = i return res def longestSubstring(self , s: str, k: int) -> int: start = 0 end = 0 length = len(s) nums = {} res = 0 while end < length: if s[end] in nums: nums[s[end]].append(end) end += 1 else: if len(nums) < k: index_list = [end] nums[s[end]] = index_list end += 1 else: res = self.getRes(start,end,res) smaller_item = self.getSmallerItem(nums) start = nums[smaller_item][-1] + 1 nums.pop(smaller_item) if end == length: res = self.getRes(start,end,res) return res