编写无重复字符最长子串的JavaScript函数及代码无输出排查
解决JavaScript最长无重复子串函数无输出问题
嘿,兄弟!我太懂你这种写了代码却没输出的憋屈了——毕竟找最长无重复子串这个问题,看似简单但很容易在细节上掉坑。虽然你没贴出自己的代码,但我可以先给你梳理下最常见的踩雷点,再给你一个经过验证的实现方案,帮你快速排查问题~
常见导致无输出的原因
- 忘了调用函数/输出结果:很多时候我们写完函数就忘了执行它,或者执行后没通过
console.log()把结果打出来。比如只写了function xxx() {},却没写console.log(xxx("test")),自然看不到输出。 - 函数没有返回值:如果你的函数里没有
return语句,哪怕逻辑是对的,调用后得到的也是undefined,输出当然是空的。 - 算法逻辑错误:比如错误地处理了重复字符的情况,导致最后计算出的最长子串长度为0,或者追踪的子串被意外清空。例如用暴力遍历的时候,遇到重复就直接重置整个当前子串,却没考虑到可能存在更长的非重复子串在后面。
- 参数传递问题:比如你调用函数时传了空字符串、
null或者非字符串类型的参数,函数内部逻辑没做处理,导致结果不符合预期。
靠谱的滑动窗口实现方案
这是时间复杂度O(n)的最优解,既可以返回最长子串的长度,也能修改后返回子串本身:
function findLongestUniqueSubstring(s) { // 用Map存储字符最近出现的索引,快速判断是否在当前窗口内 const charIndexMap = new Map(); let maxLength = 0; let windowLeft = 0; let longestSubStr = ""; for (let windowRight = 0; windowRight < s.length; windowRight++) { const currentChar = s[windowRight]; // 如果当前字符已在窗口内,移动左边界到重复字符的下一位 if (charIndexMap.has(currentChar) && charIndexMap.get(currentChar) >= windowLeft) { windowLeft = charIndexMap.get(currentChar) + 1; } // 更新当前字符的最新索引 charIndexMap.set(currentChar, windowRight); // 检查当前窗口是否是最长的,更新最长子串 const currentLength = windowRight - windowLeft + 1; if (currentLength > maxLength) { maxLength = currentLength; longestSubStr = s.substring(windowLeft, windowRight + 1); } } // 如果你只需要长度,就返回maxLength;需要子串就返回longestSubStr return longestSubStr; } // 调用并输出结果示例 const testString = "pwwkew"; console.log(findLongestUniqueSubstring(testString)); // 输出"wke"
排查自己代码的步骤
- 先确认你调用了函数并输出结果:比如有没有写
console.log(你的函数名("测试字符串")); - 检查函数里有没有正确的return语句:比如最后是不是返回了计算好的最长子串或长度?
- 模拟一次简单的测试用例(比如输入"abcabcbb"),手动走一遍自己的代码逻辑,看看是不是在某个步骤错误地重置了变量或者跳过了更新结果的环节。
- 检查参数类型:确保传入的是字符串,函数内部可以加个判断,比如
if (typeof s !== 'string') return "";避免非字符串参数导致的问题。
内容的提问来源于stack exchange,提问作者f0rta
相关产品推荐
相关产品推荐

