为何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")→ 3lengthOfLongestSubstring("bbbbb")→ 1lengthOfLongestSubstring("pwwkew")→ 3lengthOfLongestSubstring("")→ 0(原代码失败的场景)
内容的提问来源于stack exchange,提问作者iamaprogrammer
相关产品推荐
相关产品推荐

