题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

思路

可以用滑动窗口实现:

  • 用一个右指针遍历字符;
  • 一个左指针作为范围起点,用哈希表(哈希集合)存当前范围内出现的字符;
  • 用一个变量记录最长的子串长度;
  • 每次右指针循环一个字符时,判断这个字符是否在集合中出现,如果出现了则:
    • 从左向右抛出字符;
    • 更新当前子串长度;
    • 更新左指针位置;
  • 在判断字符出现后,进行:
    • 最后添加当前字符;
    • 更新最长子串长度。

最终代码:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        max_len = 0
        cur_s = set()
        cur_l = 0
        l = 0
        for ch in s:
            if ch in cur_s:
                while ch in cur_s:
                    cur_s.remove(s[l])
                    cur_l -= 1
                    l += 1
            cur_s.add(ch)
            cur_l += 1
            max_len = max(cur_l, max_len)
        return max_len

看了一下别人的代码,有更简洁的更新方式:每次在遍历时通过切片判断是否存在该字符。然后直接更新下标:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        l,r = 0, 0
        max_len = 0
        while r < len(s):
            if s[r] in s[l:r]:
                l+=1
                continue
            max_len = max(max_len, r-l+1)
            r+=1
        return max_len