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