[2025-09-23] Leetcode 3. 无重复字符的最长子串(优于官方,官方答案有问题)

题目

3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
 
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
 
提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

我的代码(Python)

向右移动指针,每移动到一个新的位置,判断是否已经在set里。如果不在,则加入,当前长度+1;如果已经在了,从set中前面的都移除,一直到碰到和当前值一样的为止,再继续计算。
实际上就是计算出以每一个位置作结尾的最长不重复子串,取最长值。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        result = 0
        n = len(s)
        currSet = set()
        currLen = 0
        for i in range(n):
            if s[i] not in currSet:
                currSet.add(s[i])
                currLen += 1
                result = max(result, currLen)
            else:
                for j in range(i - currLen, i):
                    if s[j] == s[i]:
                        break
                    currSet.remove(s[j])
                    currLen -= 1
        return result

点评

  • 官方的本身就很啰嗦,而且复杂度较高。
  • 这类算法题目都有一个默认的点,就是使用标准库的hashset,认为这样的时间复杂度最优。当然在实际编程中这是不错的,但是只基于题目,其实这算是默认实现了最困难的部分。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部