一. 滑动窗口的简单介绍
滑动窗口是双指针技巧的一种,常用于解决子串、子序列问题。滑动窗口的思想是维护一个窗口,不断滑动更新。滑动窗口的难点是各种细节:如何向窗口中添加元素、如何缩小窗口、何时更新结果。
滑动窗口有一套通用的框架,解决滑动窗口题目大家都可以尝试套用该框架。框架的整体思路是移动窗口右边界,向窗口中添加元素,窗口满足要求解的问题(如窗口等于目标子串),开始滑动左边界找到满足条件的最小值。
图来自【2】(参考来源)
二. 滑动窗口的代码模板&要点
代码模板
public void slidingWindow(String str,String target){
//用哈希表存储当前窗口中每个字符出现次数
// need:存储待查找子串每个字符出现次数
Map<Character,Integer> need,window = new HashMap();
//窗口左右边界
int left = 0;
int right = 0;
while(right<target.length()){
char c1 = str.charAt(right) //待加入窗口的字符
right++; //右滑窗口
//更新窗口信息,即哈希表状态
//满足窗口左滑条件
while(){
char c2 = s.charAt(left);
left++;
//更新窗口信息,即哈希表状态
}
}
}
要点
(1)窗口的左右边界
left和right分别负责滑动窗口的左右边界,那么有时这个窗口是固定的,有时则是不固定长度,会需要求最小长度。
(2)什么时候right++
基本在窗口内,right是每轮都需要++的,可以通过continue提前跳过本轮,减少一丢时间
(3)什么时候left++
在达到一定的条件后就需要收缩窗口了,若是固定窗口长度,泽到达固定长度后收缩,若是求最小长度,则一直收缩到窗口内的值不满足条件为止
(4)什么时候更新res
res最后的返回答案,可以在每轮right++后进行更新,也可以在left++后更新,那么有时最后一轮right<nums.length时跳出循环,注意此时是否还需要一轮比较
三. leetcode实战
1. leetcode3 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
Boolean数组
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null){
return 0;
}
boolean[] arr = new boolean[128];
char[] ch = s.toCharArray();
int left = 0;
int right = 0;
int dis = 0;
int max =0;
while(right < ch.length)