随记
滑动窗口 2021.03.15
//滑动窗口模板1:(窗口的大小不停的变化,可能求最大窗口或最小窗口)
int slide_window1(string s, string t, int maxCost)
{
int left = 0, rigth = 0;
while (rigth<s.size())
{
//对右边界进行操作
rigth++;
while (对条件进行判定)
{
//对左边界进行操作
left++;
}
//每次的窗口变化总结
}
return ;//返回值
}
//滑动窗口模板2:(窗口大小不变 为k ,可能求窗口内的属性或大小值)
int slide_window2(string s,int k)
{
for (int i = 0; i < k; i++)
{
//窗口形成
}
for (int i = k; i < s.size(); i++)
{//窗口移动
int left = i - k;//定义左边界
//对右边界 i 及左边界 left 处理
}
return max;
}
eg:
int equalSubstring(string s, string t, int maxCost)
{
int left = 0, rigth = 0;
int sum = 0, max_wide = 0;
while (rigth<s.size())
{
sum += abs(s[rigth] - t[rigth]);
rigth++;
while (sum>maxCost)
{
sum -= abs(s[left] - t[left]);
left++;
}
if (rigth - left > max_wide)
max_wide = rigth - left;
}
return max_wide;
}
int judge(char a)
{//元音返回1,否则返回0
return a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u';
}
int maxVowels(string s, int k)
{
int num = 0;
for (int i = 0; i < k; i++)
{
num += judge(s[i]);
//printf("\n%d\n", num);
}
int max = num;
for (int i = k; i < s.size(); i++)
{
int left = i - k;
num += judge(s[i]);
num -= judge(s[left]);
//printf("\n%d\n", num);
if (num > max)
max = num;
}
return max;
}