You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode最长无重复子串问题:代码在pwwkew/dvdf输入下异常求修正

修正「最长无重复子串」Python代码的问题

原代码的核心问题

  1. 重复字符处理逻辑错误:遇到重复字符时,你直接将letters重置为[s[i-1], s[i]]并把counter设为2,这完全错误——正确的做法应该是从重复字符的下一个位置开始重新统计子串,而不是保留前一个字符和当前重复字符。比如输入"dvdf",当遍历到第二个'd'时,应该从'v'开始重新统计,而非保留'v'和'd'。
  2. 计数器更新逻辑冗余且错误:你通过i==0或s[i] != s[i-1]来增加counter,但实际上只要当前字符不在letters中,直接通过len(letters)就能得到当前子串长度,不需要额外条件判断。
  3. 未处理最后一段子串:只有遇到重复字符时才更新max_length,但如果最后一段无重复子串是最长的,你的代码会漏掉这个更新。
  4. 特殊判断多余:len(set(s)) ==1的判断可以被通用逻辑覆盖,无需单独处理。

修正后的代码(简化版)

这个版本基于你原有的列表思路优化,逻辑更清晰:

def lengthOfLongestSubstring(s):
    current_sub = []
    max_len = 0
    for char in s:
        # 若当前字符已在子串中,截断到重复字符的下一位
        if char in current_sub:
            idx = current_sub.index(char)
            current_sub = current_sub[idx+1:]
        # 添加当前字符到子串
        current_sub.append(char)
        # 实时更新最大长度
        max_len = max(max_len, len(current_sub))
    return max_len

更高效的滑动窗口版本(O(n)时间复杂度)

上面的版本中list.index()是O(n)操作,对于长字符串效率较低。用哈希表记录字符的最新索引,配合双指针实现滑动窗口,能将时间复杂度降到O(n):

def lengthOfLongestSubstring(s):
    char_pos = {}
    max_len = 0
    left = 0  # 滑动窗口左边界
    for right, char in enumerate(s):
        # 若字符已存在且在当前窗口内,移动左边界到重复字符的下一位
        if char in char_pos and char_pos[char] >= left:
            left = char_pos[char] + 1
        # 更新字符的最新位置
        char_pos[char] = right
        # 计算当前窗口长度并更新最大值
        max_len = max(max_len, right - left + 1)
    return max_len

测试验证

  • 输入"pwwkew":两个版本均返回3(对应子串"wke"或"kew")
  • 输入"dvdf":两个版本均返回3(对应子串"vdf")

内容的提问来源于stack exchange,提问作者AT Hill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:17:50