3. 无重复字符的最长子串 
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
示例:
js
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解题思路
使用滑动窗口,每次循环移动右指针,左指针只在窗口内出现重复字符时移动,并记下窗口长度。
- 定义一个滑动窗口,用两个指针表示窗口的左右边界,即左指针和右指针
 - 每次循环开始时,检查新字符(即右指针所在位置字符)在窗口中是否重复
 - 如重复,移动左指针到该字符串重复位置的下一位
 - 然后,记录新字符最后出现位置
 - 记录下窗口的最大长度
 - 每次循环结束时,向右移动右指针
 
动画演示
字符串: abcabcbb
最长子串的长度: 0
左指针: 0
右指针: 0
哈希表: []
 a  b  c  a  b  c  b  b 
参考答案
ts
function lengthOfLongestSubstring(s: string): number {
  // 无重复字符的最长子串长度
  let max = 0;
  // 定义双指针
  let left = 0;
  let right = 0;
  // 定义哈希表
  const hash = new Map();
  // 滑动窗口
  while (left < s.length && right < s.length) {
    if (left !== right && hash.has(s[right])) {
      // 重复字符,移动左指针到重复字符的下一个字符
      // 使用 Math.max 防止回退
      left = Math.max(left, hash.get(s[right]) + 1);
    }
    // 记录字符最后出现的位置
    hash.set(s[right], right);
    // 记录最大长度
    max = Math.max(max, right - left + 1);
    // 移动右指针
    right++;
  }
  // 返回结果
  return max;
};