- 困扰大家的,不是算法的思路,而是各种细节问题,比如说如何向窗口中添加新元素,如何缩小窗口,在滑动窗口的各个阶段进行更新窗口。
- 滑动窗口框架:
/*滑动窗口算法的框架*/
function slidingWindow(s,t){
let window = new Map();
let left = 0, right = 0;
let valid = 0;
while(right < s.size()) {
// c是要移入窗口的字符
char c = s[right];
right++;
// 进行窗口数据的一系列更新;
// left right
// 判断窗口是否需要收缩
while(window needs shrink) {
// d是将要移除窗口的字符
char d = s[left];
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
var lengthOfLongestSubstring = function(s) {
let window = new Map();
let left = 0;
let right = 0;
let len = 0;
while(right < s.length) {
let c = s.charAt(right);
if(window.has(c)) {
window.set(c, window.get(c) + 1);
} else {
window.set(c, 1);
}
right++; // 指针向右移动
while(window.get(c) > 1) {
let d = s.charAt(left);
left++;
window.set(d, window.get(d) - 1);
}
len = Math.max(len, right - left);
}
return len;
}