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

最长无重复字符子串长度计算:代码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:17:30