对于定长类滑动窗口的问题我总结了以下的步骤:
(1)确定窗口的大小
(2)处理初始窗口
(3)滑动窗口
其中滑动窗口以及处理初始窗口的逻辑如下:
(1)向当前窗口内添加新元素
(2)根据具体题目要求对窗口内元素进行统计处理
(3)移除当前窗口内的旧元素
// 处理初始窗口:
for(int i = 0; i < k; i++){
// 统计当前窗口内的信息:
}
// 对初始窗口进行具体的分析:
...
for(int i = k; i < n; i++){
// 向当前窗口添加新元素:
unique_nums[s[i]]++;
// 判断当前窗口内的情况
...
// 移除当前窗口内的旧元素
unique_nums[s[i - k]]--;
// 判断当前窗口内的情况
...
// 对滑动窗口进行具体的分析:
...
}
以1456为例:
class Solution {
public:
int maxVowels(string s, int k) {
int n = s.size();
// 当前遍历过得窗口内的最大元音字母数量:
int cur = 0;
// 存放最终结果:
int res = 0;
// 定义存放元音字母的数组
vector<char> con = {'a', 'e', 'i', 'o', 'u'};
// 处理初始窗口:
for(int i = 0; i < k; i++){
if(find(con.begin(), con.end(), s[i]) != con.end()){
cur++;
}
}
// 处理初始窗口:
res = max(cur, res);
for(int i = k; i < n; i++){
// 添加新元素:
if(find(con.begin(), con.end(), s[i]) != con.end()){
cur++;
}
// 移除旧元素:
if(find(con.begin(), con.end(), s[i - k]) != con.end()){
cur--;
}
// 处理当前窗口
res = max(res, cur);
}
return res;
}
};