最长无重复字符子串长度计算:代码if条件未执行问题排查
排查最长无重复子串代码的问题
你遇到的核心问题其实很直观——你的代码从来没有把遍历到的字符加入到Set里!这就导致Set始终是空的,set.has(s[i])永远返回false,自然永远不会进入if分支。
咱们一步步拆解问题:
1. 为什么if条件从未执行?
看你的代码:
var lengthOfLongestSubstring = function(s) { let set = new Set(); let c =0; for(let i =0; i< s.length; i++){ if(set.has(s[i])){ set.size =0; } else { console.log(c) c++; } } return c; };
你只在判断当前字符是否在Set里,但从头到尾没有调用set.add(s[i])把字符存入Set。空的Set当然不会包含任何字符,所以if分支永远不会触发。
2. 代码里的其他逻辑错误
就算你加上了set.add(s[i]),还有几个明显的问题:
set.size = 0是无效操作:Set的size是只读属性,不能直接赋值。要清空Set应该用set.clear()。- 逻辑思路错误:当前的逻辑是遇到重复就重置计数,但这不符合最长无重复子串的要求。比如输入"abcb",正确的最长子串是"abc"(长度3),但你的代码遇到第二个b时会错误重置计数,最后返回的结果会偏离正确值。
3. 正确的滑动窗口实现思路
解决这个问题的标准方法是滑动窗口法,用左右指针维护一个无重复字符的窗口,同时记录窗口的最大长度:
var lengthOfLongestSubstring = function(s) { let set = new Set(); let maxLength = 0; let left = 0; // 窗口左边界 for (let right = 0; right < s.length; right++) { // 如果当前字符已在Set中,移动左指针直到移除重复字符 while (set.has(s[right])) { set.delete(s[left]); left++; } // 将当前字符加入Set set.add(s[right]); // 更新最大长度 maxLength = Math.max(maxLength, right - left + 1); } return maxLength; }; console.log(lengthOfLongestSubstring("abcabcbb")); // 输出3
这个逻辑的核心是:
- 右指针不断向右扩展窗口
- 遇到重复字符时,左指针向右移动,直到窗口内没有重复字符
- 每次扩展窗口后,计算当前窗口长度并更新最大值
这样就能正确找到最长的无重复字符子串长度了。
内容的提问来源于stack exchange,提问作者sd_30
相关产品推荐
相关产品推荐

