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

为何LeetCode提交显示“Wrong Answer”但本地运行正常?无重复字符最长子串求解代码问题咨询

问题分析与修复方案

兄弟,我瞅了下你的代码,本地跑那几个测试用例没问题,但LeetCode提交报Wrong Answer,大概率是没覆盖到空字符串这类边界场景,另外原代码的效率也存在隐患,咱一步步拆解:

核心错误原因

当输入s为空字符串时,你的result数组会是空的,此时Math.max(...result)会返回-Infinity,但LeetCode对空字符串的预期输出是0,这直接导致了提交失败。

除此之外,原代码的时间复杂度是O(n²)(外层循环+内层includes判断),如果遇到超长字符串测试用例,还会触发超时问题。

修复后的基础版本(保留原逻辑,解决错误)

我给你补了空字符串的边界判断,同时简化了部分逻辑,保证能通过所有基础测试用例:

let lengthOfLongestSubstring = (s) => { 
  // 先处理空字符串边界,直接返回0
  if (s.length === 0) return 0;
  let result = []; 
  for (let i = 0; i < s.length; i++) { 
    let currentSub = []; 
    let n = i; 
    // 把s[n]的判断改成n < s.length,更严谨
    while (n < s.length && !currentSub.includes(s[n])) { 
      currentSub.push(s[n]); 
      n++; 
    } 
    result.push(currentSub.length); 
  } 
  return Math.max(...result); 
} 

更优的滑动窗口版本(解决错误+优化性能)

如果想同时解决超时问题,推荐用滑动窗口思路,时间复杂度降到O(n),每个字符只遍历一次,同时天然覆盖所有边界场景:

let lengthOfLongestSubstring = (s) => {
  let maxLen = 0;
  let left = 0;
  const charMap = new Map();
  
  for (let right = 0; right < s.length; right++) {
    const currentChar = s[right];
    // 如果当前字符已在窗口内,且索引不小于左边界,就移动左边界到重复字符的下一位
    if (charMap.has(currentChar) && charMap.get(currentChar) >= left) {
      left = charMap.get(currentChar) + 1;
    }
    // 更新当前字符的最新索引
    charMap.set(currentChar, right);
    // 计算当前窗口长度,更新最大长度
    maxLen = Math.max(maxLen, right - left + 1);
  }
  
  return maxLen;
}

验证测试用例

这两个版本都能通过你的测试用例:

  • lengthOfLongestSubstring("abcabcbb") → 3
  • lengthOfLongestSubstring("bbbbb") → 1
  • lengthOfLongestSubstring("pwwkew") → 3
  • lengthOfLongestSubstring("") → 0(原代码失败的场景)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:02:45