剑指 Offer 48. 最长不含重复字符的子字符串

121 阅读1分钟

剑指 Offer 48. 最长不含重复字符的子字符串

代码实现在最下面,下面的图片展示,打断点的调试过程,解题思路是,先声明一个数组window,和一个最大值max,然后遍历数组,从前往后遍历每一项,把每一项放入数组window中,放入每一项都会去记录max值,但是放入每一项有个前提条件就是,不可以和之前放入的每一项重复了,如果重复了仍然想要进入window数组,则需要把从window的第一项到和当前项相等的下标位置,全部删除,不用担心会影响max值,因为在这里会做大小判断,max会记录之前最长的时刻的,如果后续window不够长了,就不会影响max值。

image.png

const lengthOfLongestSubstring = s => {
  // 滑动窗口
  const window = [];
  let max = 0;
  const len = s.length;
  for (let i = 0; i < len; i++) {
      // 当前字符在窗口中的索引
      const index = window.indexOf(s[i]);
      if (index !== -1) {
          // 当前字符在窗口中出现过,那么就将窗口中[0,index]区间的全部去除
          // 从index+1开始新一轮的窗口
          window.splice(0, index + 1);
      }
      // 当前字符加入窗口
      window.push(s[i]);
      // 更新最大值
      if (max < window.length) max = window.length;
  }
  return max;
};

console.log(lengthOfLongestSubstring("abcdbefghijk"));

打断点

image.png