LeetCode159:Longest Substring with At Most Two Distinct Characters

Given a string s , find the length of the longest substring t  that contains at most 2 distinct characters.

Example 1:

Input: "eceba"
Output: 3
Explanation: tis "ece" which its length is 3.

Example 2:

Input: "ccaabbb"
Output: 5
Explanation: tis "aabbb" which its length is 5.

这道题给我们一个字符串,让我们求最多有两个不同字符的最长子串。那么我们首先想到的是用 HashMap 来做,HashMap 记录每个字符的出现次数,然后如果 HashMap 中的映射数量超过两个的时候,我们需要删掉一个映射比如此时 HashMap 中e有2个,c有1个,此时把b也存入了 HashMap,那么就有三对映射了,这时我们的start是0,先从e开始,映射值减1,此时e还有1个,不删除,start自增1。这时 HashMap 里还有三对映射,此时 start是1,那么到c了,映射值减1,此时c映射为0,将c从 HashMap 中删除,left 自增1,然后我们更新结果为 end - start+ 1,以此类推直至遍历完整个字符串。

计算最大长度一定要在循环之外算,因为start指针始终是满足k的条件的,如果不满足,start指针会后移,所以在循环之外用end-start+1就是最大值。

class Solution(object):
    def lengthOfLongestSubstringTwoDistinct(self, s):
        start, end = 0, 0
        max_length = 0
        buff_dict = {}
        for c in s:
            buff_dict[c] = buff_dict.get(c, 0) + 1
            # while have more than k, we keep removing from i
            while len(buff_dict) > 2:
                buff_dict[s[start]] -= 1
                if buff_dict[s[start]] == 0:
                    del buff_dict[s[start]]
                start += 1
            max_length = max(max_length, end - start+1)
            end += 1
        return max_length

 

你可能感兴趣的:(LeetCode)