前往此题

解题思路

这题我们用滑动窗口来做,非常简单明了就能解决。

要解决这道题,我们需要创建四个变量:

  • 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