LeetCode | 3.无重复字符的最长子串

76 阅读1分钟

滑动窗口(Sliding Window)算法

##题目: 给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度。

**流程图

代码:

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  if (arguments.length <= 0 || typeof s !== "string") {
    return console.log("请输入字符串");
  }

  //定义一个哈希表(如 Map 或对象)记录每个字符上一次出现的位置
  const map = new Map();

  //定义两个指针模拟窗口的左右边界:left 表示窗口的左边界,right 表示窗口的右边界。
  let left = 0,
    right = 0;

  //定义一个变量 maxLength 用于记录最长子串的长度。
  let maxLength = 0;

  // 遍历字符串: right指针是否越界
  while (right < s.length) {
    // 检查当前字符是否已经在哈希表中出现过。
    if (map.has(s[right])) {
      // 如果出现过,更新 left 指针为 当前字符在窗口左边最近一次出现的位置
      // 让left左指针跳过那个重复字符,保证窗口内所有字符都不重复
      left = Math.max(left, map.get(s[right]) + 1);
    }

    // right指针向右依次遍历字符串中的每一个字符 并且更新字符的最新位置到哈希表中。
    // 设置键值对   map.set(key,value) key代表字符,value为该字符最近一次出现的索引
    map.set(s[right], right);

    // 实时更新当前找到的“最长无重复子串”的长度。
    // 索引从0开始 长度从1开始 ===>   区间 [left, right] 的长度 = 右指针 - 左指针 + 1
    maxLength = Math.max(maxLength, right - left + 1);
    // 移动 right 指针到下一个字符。
    right++;
  }
  return maxLength;
};

用例:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。

执行过程:

image.png