滑动窗口的思想
让数据不断进入队列,直到不满足条件的时候,移除最左边的数据直到满足条件,然后再重新往队列里面加数据
leetcode
滑动窗口模版
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
// 滑动窗口中字符出现的次数
Map<Character, Integer> window = new HashMap<Character, Integer>();
//window.getOrDefault(ch,0)
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
// c 是将移入窗口的字符
char c = s.charAt(right);
// 如果满足条件就将 c移入窗口中,并进行窗口内数据的一系列更新
if(...)
...
// 右移窗口
right++;
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
char d = s.charAt(left);
// 如果满足一定条件,进行窗口内数据的一系列更新,使得退出这个 while循环
if(...)
...
// 左移窗口
left++;
}
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> window = new HashMap<Character, Integer>();
//window.getOrDefault(ch,0)
int left = 0, right = 0;
int valid = 0;
while (right < s.length()) {
// c 是将移入窗口的字符
char c = s.charAt(right);
// 如果满足条件就将 c移入窗口中,并进行窗口内数据的一系列更新
window.put(c,window.getOrDefault(c,0)+1);
// 右移窗口
right++;
// 判断左侧窗口是否要收缩
while (window.get(c)>1) {
// d 是将移出窗口的字符
char d = s.charAt(left);
// 如果满足一定条件,进行窗口内数据的一系列更新,使得退出这个 while循环
window.put(d,window.get(d)-1);
// 左移窗口
left++;
}
valid = Math.max(valid,right-left);
}
return valid;
}
}
public int minSubArrayLen(int target, int[] nums) {
// Map<Integer,Integer> windows = new HashMap<>();
int sumResult = 0,result=Integer.MAX_VALUE,left = 0;
for(int i=0;i<nums.length;i++){
sumResult += nums[i];
// windows.put(i,nums[i]);
while(sumResult>=target){
result = Math.min(result,i-left+1);
sumResult -= nums[left];
left +=1;
}
}
return result==Integer.MAX_VALUE?0:result;
}
class Solution {
// 充分利用只有小写字母的情况
public boolean checkInclusion(String s1, String s2){
int[] needs = new int[26];
int left = 0;
for(int i=0;i<s1.length();i++){
needs[s1.charAt(i)-'a'] -= 1;
}
for(int i=0;i<s2.length();i++){
needs[s2.charAt(i)-'a'] += 1;
while (needs[s2.charAt(i)-'a']>0){
needs[s2.charAt(left)-'a']-=1;
left +=1;
}
if (s1.length()==(i-left+1)){
return true;
}
}
return false;
}
}