题解 | #至多包含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

全部评论

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务