LeetCode 159.至多包含两个不同字符的最长子串

LeetCode 159.至多包含两个不同字符的最长子串

详细题目

题目分析

题目理解没难度,比较典型的一道 滑动数组 题目,把握好表示状态就行。
状态表示:数组中最多包含两个不同字符的状态,可以用一个列表(code中的c)存下数组中不同的字符,再存下各字符的数量(这里用字典存,code中的m)。用 l l l r r r 表示滑动数组 S [ l : r ) S[l:r) S[l:r) ,然后开始滑动数组。滑动右端时,看 S [ r ] S[r] S[r] 是否在c中。在则相应字符数量加一,否则判断c的长度,如果为2则意味数组加入 S [ r ] S[r] S[r] 不符合正确状态,需要移动数组左端,直到状态恢复正常(包含至多两个不同字符)。
每次滑动数组改变时,比较数组长度。

代码

class Solution:
    def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:
        c = [] # 记录不同字符
        m = {} # 记录不同字符的数量
        l, r = 0, 0 # 滑动数组的左右端
        res = 0
        
        while r < len(s):
            if s[r] in c: # 数组状态正常
                m[s[r]] += 1
            else:
                while len(c) == 2: # 恢复数组状态
                    m[s[l]] -= 1
                    if m[s[l]] == 0:
                        c.remove(s[l])
                    l += 1
                c.append(s[r])
                m[s[r]] = 1
            r += 1
            res = max(res, r - l)
        
        return res

你可能感兴趣的:(LeetCode,刷题)