前言
这不是一个给一道题目然后告诉你题解的系列,而是对于一系列题目进行分类,找出他们解题规律并得出大致框架代码的文章。吃透解一系列题目的规律比会解单个题目有用得多,毕竟你总会遇到没刷过的题。
正文
大家对于滑动窗口应该不陌生,在 TCP 协议中就有这个概念的出现,用于控制网络流量,避免拥塞发生。
在算法中这个思想也是类似的,多用于解决在一段连续的区间中寻找满足条件的问题,比如说给定一个字符串,寻找出无重复字符的最长子串。该思路主要应用于数组及字符串的数据结构中。
示例
滑动窗口主要思路是维护一对指针,在一定条件内右移右指针扩大窗口大小直到窗口内的解不满足题意,此时我们需要根据情况移动左指针,重复移动左右指针的操作并在区间内求解,直到双指针不能再移动。
以 寻找出无重复字符的最长子串 题目为例,根据上述的思路解题就会很方便:
var lengthOfLongestSubstring = function(s) {
// 用于存储指针移动过程中的值
let map = {}
// 双指针
let left = 0
let right = 0
// 结果
let count = 0
// 指针移动终止条件
while (right < s.length) {
const char = s[right]
// 根据题意我们需要寻找不重复的最长子串