给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是
"abc",所以其
长度为 3。
示例 2:
输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是
"b"
,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
- 用双指针维护一个滑动窗口,用来剪切字符串
- 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
- 过程中,记录所有窗口的长度,并返回最大值
/** * @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 }