给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = “pwwkew”

输出: 3

解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

  1. 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题解

  1. 用双指针维护一个滑动窗口,用来剪切字符串
  2. 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
  3. 过程中,记录所有窗口的长度,并返回最大值
    /**
    * @param {string} s
    * @return {number}
    */
    var lengthOfLongestSubstring = function (s) {
     let start = 0,
         end = 0,
         result = 0
     const dict = new Map()
     while (end < s.length) {
         const char = s[end]
         if (dict.has(char) && dict.get(char) >= start) { // 此处条件判断非常关键
             start = dict.get(char) + 1
         }
         dict.set(char, end)
         end++
         result = Math.max(result, end - start)
     }
     return result
    }