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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值