手写算法:无重复字符的最长子串

3. 无重复字符的最长子串open in new window

思路一:left、right 的 while 循环双指针滑动窗口

可以用滑动窗口来实现

  1. 用 left、right 双指针,遍历字符串,通过 hash set 将字符保存起来,遇到重复字符时,收紧窗口。

  2. 收紧窗口的同时,需要将窗口内的重复字符剔除掉,再往右走,直到走完整个字符串。

function lengthOfLongestSubstring(s) {
  const len = s.length;
  // 左右指针初始都为0
  let left = 0,
    right = 0;
  // 最大子串长度
  let maxLength = 0;
  // 滑动窗口,存储字符
  let window = new Set();

  while (left < len && right < len) {
    // 判断滑动窗口中是否包含字符
    if (window.has(s.charAt(right))) {
      // 剔除重复字符
      window.delete(s.charAt(left));
      // 收紧窗口
      left++;
    } else {
      // 不包含,添加字符
      window.add(s.charAt(right));
      // 指针继续向右
      right++;
      // 计算当前重复子串的长度
      const curLength = right - left;
      // 取最大的长度
      maxLength = Math.max(maxLength, curLength);
    }
  }
  return maxLength;
}

思路二:for 循环滑动窗口

这样不用每次都计算 right 的值

当 i=0 的时候,窗口不向右移动

var lengthOfLongestSubstring = function(s) {
  const len = s.length;
  let set = new Set(),
    point = 0,
    max = 0;

  for (let i = 0; i < len; i++) {
    if (i !== 0) set.delete(s[i - 1]);

    while (point < len && !set.has(s[point])) {
      set.add(s[point]);
      point++;
    }
    max = Math.max(max, set.size);
  }
  return max;
};

手写题:手写 vuex 新版和老版

手写 vuex 新版和老版

手写 Vuex3.x

手写 Vuex4.x

Last Updated:
Contributors: kk