滑动窗口解题模板
问题
解题模板
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
int equalSubstring(string s, string t, int maxCost)
{
int sum = 0;
int ans = 0;
int st = 0;
int ed = 0;
// 循环不变式:在每一次循环之前都面对一个新的窗口[st,ed]
// 终止:ed到达末尾,此时只能收缩st,窗口只会越变越小,因此为结束条件
while(ed < s.size())
{
// 更新窗口
sum += abs(s[ed] - t[ed]);
// 判断窗口是否正确,如果不正确,并且还能收缩,那么就收缩
while(sum > maxCost && st <= ed)
{
sum -= abs(s[st] - t[st]);
st++;
}
// 更新记录
ans = max(ans,ed - st + 1);
// 创建下一个窗口
ed++;
}
return ans;
}
};
最大与最小差值问题
求最大与最小差值问题,可以先排序,然后再通过尺取法进行计算。
最小覆盖问题
滑动窗口经典题目。
class Solution
{
public:
string minWindow(string s, string t)
{
vector<int> sd(100);
for (int i = 0; i < t.size(); i++)
{
sd[t[i] - 'A']++;
}
int pk = 0;
for (int i = 0; i < 100; i++)
if (sd[i] != 0)
pk++;
int r = 0, l = 0;
vector<int> cnt(100);
int kp = 0;
int mi = 9999999;
int al = 0;
int ar = 0;
while (r < s.size())
{
cnt[s[r] - 'A']++;
if (cnt[s[r] - 'A'] == sd[s[r] - 'A'])
kp++;
while (l <= r && cnt[s[l] - 'A'] > sd[s[l] - 'A'])
{
cnt[s[l] - 'A']--;
l++;
}
if (kp == pk && r - l + 1 < mi)
{
mi = r - l + 1;
al = l;
ar = r;
}
r++;
}
if (mi == 9999999)
return "";
else
return s.substr(al, ar - al + 1);
}
};