定义
滑动窗口:简单的意思就是说,定义了两个指针(左指针及右指针),循环快指针,不断判断两个指针之间的是否符合条件,如果不符合条件左指针+1
下面是伪代码
const functionName = (s) => {
// Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表)
let x, y = ..., ...
// Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
let start = 0
for(let end = 0; end < s.length; end++){
// Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度)
let x = new_x
if (condition) {
y = new_y
}
/*
------------- 下面是两种情况,读者请根据题意二选1 -------------
*/
// Step 4 - 情况1
// 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度
// 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变,
// 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量
if (窗口长度达到了限定长度) {
更新 (部分或所有) 维护变量
窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变
}
// Step 4 - 情况2
// 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题
// 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法
// 在左指针移动之前更新Step 1定义的(部分或所有)维护变量
while (不合法){
# 更新 (部分或所有) 维护变量
# 不断移动窗口左指针直到窗口再次合法
}
}
// Step 5: 返回答案
return ...
}
代码
练习一:无重复字符的最长子串
练习地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路:使用哈希判断是否重复,使用滑动窗口一遍循环搞定
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const sArr = s.split("");
let start = 0, end = 0;
let tempMap = {};
let res = 0;
for(; end < sArr.length; end++) {
if (tempMap[sArr[end]]) {
res = Math.max(end - start, res);
start++;
end = start;
tempMap = {}
}
tempMap[sArr[end]] = 1;
}
return Math.max(end - start, res);
};