leetcode340.至多包含 K 个不同字符的最长子串

1.题目描述

给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。

示例 1:

输入: s = "eceba", k = 2
输出: 3
解释: 则 T 为 "ece",所以长度为 3。
示例 2:

输入: s = "aa", k = 1
输出: 2
解释: 则 T 为 "aa",所以长度为 2。

2.解题思路

滑动窗口思想,初始时左右指针都指向0,移动右指针,用一个字典window记录当前窗口内出现的字符的次数,并用一个变量count记录窗口内不同字符的数量。当count>k时,缩紧窗口,向右移动左指针,并更新window内字符数量和count。当count = k时,求结果。

3.代码实现

class Solution(object):
    def lengthOfLongestSubstringKDistinct(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        """
        2020新年第一题,没看答案成功通过一道hard题目,开心!
        """
        left = 0
        right = 0
        window = {}
        count = 0
        res = 0
        if len(set(s)) < k:
            return len(s)
        while right < len(s):
            if s[right] not in window:
                count += 1
            window[s[right]] = window.get(s[right],0) + 1
            while count > k:
                if window[s[left]] == 1:
                    count -= 1
                    window.pop(s[left])
                else:
                    window[s[left]] = window[s[left]] - 1
                left += 1
            if count == k:
                    res = max(res,right-left+1)
            right += 1
        return res

第二遍做:

class Solution(object):
    def lengthOfLongestSubstringKDistinct(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        """
        """
        left = 0
        right = 0
        window = {}
        count = 0
        res = 0
        if len(set(s)) < k:
            return len(s)
        while right < len(s):
            if window.get(s[right],0)==0:
                count += 1
            window[s[right]] = window.get(s[right],0) + 1
            while count > k:
                if window[s[left]] == 1:
                    count -= 1
                window[s[left]] = window[s[left]] - 1
                left += 1
            if count == k:
                    res = max(res,right-left+1)
            right += 1
        return res

 

你可能感兴趣的:(leetcode)