// 字典结合滑动窗口
// 设置 左右双指针 用于确定滑动窗口的大小
// 遍历字符串,不断的向字典中加入元素
// 当右指针指向的元素值存在于字典当中,则让左指针指向重复元素的下一位(更新窗口)
var lengthOfLongestSubstring = function (s) {
let map = new Map();
let left = 0;
let res = 0;
for (let right = 0; right < s.length; right++) {
// 如果当前元素值存在于字典当中,更新左指针
// 要排除在滑动窗口左指针左侧的重复元素,避免把 left 指针更新到滑动窗口外部
// 所以 map.get(s[right]) >= left
if (map.has(s[right]) && map.get(s[right]) >= left) {
left = map.get(s[right]) + 1;
}
// 每次循环都要向字典追加当前元素值和对应下标
// 每次循环都要计算一下滑动窗口大小
map.set(s[right], right);
res = Math.max(res, right - left + 1);
}
return res;
};
自己掉进的坑:
1.每次循环都要把当前元素值及其下标加入字典
2.更新左指针时,要排除掉在当前左指针左侧的重复元素,即避免把 left 指针更新到滑动窗口外部
3.每次循环的时候都要计算一下滑动窗口大小,而不是发现重复元素了再去计算大小。
比如给定的字符串没有重复的元素,那么最长字串长度就应该为字符串长度,如果不每次循环都计算滑动窗口大小,由于没有重复字串则不会进行滑动窗口计算。