3. Longest Substring Without Repeating Characters

维护一个Map,维护从下标 left 到下标 right 的字符的字符到出现次数的映射,保证次数 <= 1
思路:滑动窗口,如果 [i, j] 区间内有重复字符,移动左指针,删除Set元素,直到没有重复为止。如果没有重复字符。移动右指针增加Set元素,直到有重复为止
js
/**
* @param {string} s
* @return {number}
*/
// 思路:滑动窗口,如果 [i, j] 区间内有重复字符,移动左指针,删除Set元素,直到没有重复为止。
// 如果没有重复字符。移动右指针增加Set元素,直到有重复为止
var lengthOfLongestSubstring = function (s) {
let ans = 0
let left = 0
const window = new Set() // 维护从下标 left 到下标 right 的字符
for (let right = 0; right < s.length; right++) {
const c = s[right]
// 如果窗口内已经包含 c,那么再加入一个 c 会导致窗口内有重复元素
// 所以要在加入 c 之前,先移出窗口内的 c
while (window.has(c)) {
// 窗口内有 c
window.delete(s[left])
left++ // 缩小窗口
}
window.add(c) // 加入 c
ans = Math.max(ans, right - left + 1) // 更新窗口长度最大值
}
return ans
}