003——无重复字符的最长子串

003——无重复字符的最长子串

1.题目

003——无重复字符的最长子串

2.我的解决办法

  • 思路
    • 使用列表作为滑动窗口
    • 使用i,j作为窗口的开始和结束指针
    • 碰到重复/遍历到字符串末尾清空窗口,统计窗口最大值
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ls = []     # 定义空列表作为滑动窗口
        max_len = 0 # 最大长度
        count = 0   # 滚动统计数
        if len(s) == 1: # 当字符串长度为1
            return 1
        for i in range(len(s)): # 当字符串长度大于1
            if max_len <count:  # 内循环终止的情况2:没有碰到重复且遍历到字符串末尾,这时需要进行比较
                max_len = count
            ls.clear()  # 当i指针更换时,列表清零,重新计数
            count = 0
            ls.append(s[i])
            count += 1
            for j in range(i+1, len(s)):
                if s[j] in ls:  # 内循环终止的情况2:碰到重复,这是需要进行比较
                    if(max_len < count):
                        max_len = count
                    count = 0
                    break
                ls.append(s[j])
                count += 1
        return max_len

3.官方的解决办法

  • 反思:最大的区别在于,官方的解决方案在左指针发生更换的时候,并没将窗口长度清除为0,而是在原来的基础之上增大窗口的长度再进行尝试
  • 当发生重复之前,窗口内是不重复的,所以没有必要用clear将右指针进行改变
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 哈希集合,记录每个字符是否出现过
        occ = set()
        n = len(s)
        # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:
                # 不断地移动右指针
                occ.add(s[rk + 1])
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans
上一篇:SQL 语法速成手册


下一篇:【力扣】无重复字符的最长字串