自己的模板:
//求满足条件的最小
int l = 0;
for (int r = 0; r < n; ++r) {
//窗口放大 和第二步顺序不固定。。
加入nums[r]
//缩小窗口
while (当前窗口不满足了->适用于最长的子数组 || 满足&&左边界可以右移->适用于找最小的子数组){
删掉nums[l++]
}
//更新ans:
(如果满足条件) 则ans = max(ans, r - l + 1)求最长子数组
}
//固定k长度的滑动窗口
//适用于:abs(i - j) <= x的区间范围->slide window ,维护一个长度为x + 1的固定区间
l = 0;
for (int r = 0; r < n; ++r) {
if (r >= k) 去掉l++处的元素
加入r处的元素
如果长度为k且满足题意 更新ans或者return true/false
}
还款机制
方法一:
for (auto& ch : p) flag[ch - 'a']++;
if (--flag[s[r] - 'a'] >= 0) cnt++; //右边界--后:>=0表示增加一次有效还款
if (++flag[s[l] - 'a'] > 0) cnt--; //左边界++后:>0表示失去一次有效还款
//方法二:
//for (auto& s : words) hash[s]++;
//if (++hash2[sr] <= hash[sr]) cnt++;//增加一次有效还款
//if (--hash2[sl] < hash[sl]) cnt--; //表示失去一次有效还款