解题思路
这题我们用滑动窗口来做,非常简单明了就能解决。
要解决这道题,我们需要创建四个变量:
- curL: 代表当前符合无重复字符窗口的长度
- maxL: 代表遍历至现在遇到的最长窗口
- lookup: 存储窗口中的字符集合,如果遇到重复则窗口往右移并缩小窗口
- left: 用于指向窗口左侧,如果发现窗口中有重复数字,则窗口往右移即
left+=1
,并且移动窗口lookup.remove(s[left])
我们只需遍历整个字符串,将遇到的字符放入窗口lookup
中,用maxL
记录最大窗口,curL
记录当前窗口大小,如果遇到重复字符则缩小窗口并往右移。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s: return 0
N = len(s)
curL, maxL = 0, 0
lookup = set()
left = 0
for i in range(N):
curL += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
curL -= 1
if curL > maxL: maxL = curL
lookup.add(s[i])
return maxL