滑动窗口模板分解
- 特殊情况判断
- 申请一个散列,用于记录窗口中每一个元素个数
int[] need=new int[128];
- 定义左指针、记录条件的变量与结果集
int left=0,count=..,result=..;
- 开始滑动窗口,i可代替右指针
for(int i=0;i<S.length;i++){
- 更新新元素在散列中的数量
need[sArr[i]]--;
- 根据窗口的变更结果来改变条件值
if(need[sArr[i]] == > < ){
count++;
}
- 如果当前条件不满足,一直移动左指针直至条件满足为止
while(count>k||...){
...
if(...){
count--;
}
need[sArr[left]]++;
left++;
}
- 更新结果
results=..
}
return results;
整体模板
public class 模板 {
public int slidingWindowTemplate(String[] a, ...){
// 输入参数有效性判断
if(...) {
...
}
// 申请一个散列,用于记录窗口中具体元素的个数情况
// 这里用数组的形式呈现,也可以考虑其他数据结构
int[] need = new int[...];
// 预处理(可省), 一般情况是改变 hash
...
// l 表示左指针
// count 记录当前的条件,具体根据题目要求来定义
// result 用来存放结果
int left= 0, count = ..., result = ...;
for( int i = 0; i < S.length; i++) {
// 更新新元素在散列中的数量
hash[S[i]]--;
// 根据窗口的变更结果来改变条件值
if(need[S[i]] == ...) {
count++;
}
// 如果当前条件不满足,移动左指针直至条件满足为止
while(count > K || ...) {
...
if(...) {
count--;
}
need[A[left]]++;
left++;
}
// 更新结果
results = ...
}
return results;
}
}
利用滑动模块模板解决滑动模块题:
1、3:中等leetcode滑动窗口模板之无重复字符的最长子串3
2、76:困难 leetcode滑动窗口模板之最小覆盖子串76
3、438:中等leetcode滑动窗口模板之找到字符串中所有字母异位词438
4、424:中等leetcode滑动窗口模板之替换后的最长重复字符424
5、567:中等leetcode滑动窗口模板之字符串的排列567
6、992:困难leetcode滑动窗口模板之k个不同整数的子数组992