滑动窗口,双指针

滑动窗口

思路

  1. 在字符串s中使用双指针中的左右指针技巧,初始化left = right = 0,把索引左闭右开区间[left, right)称为一个窗口。
  2. 先不断增加right指针扩大窗口,直到窗口中的所有字符串符合要求寻找可行解()
  3. 此时,我们停止增加right,转而不断增加left缩小指针窗口,直到窗口中的字符串不再符合要求,同时,每次增加left,都要更新一轮结果。(优化可行解)
  4. 重复第2,3步,直到right到达字符串s的尽头。

代码框架

void slidingWindow(string s, string t) {
// 记录窗口中的字符和需要凑齐的字符
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
//开始滑动
// c 是将移入窗口的字符
char c = s[right];
// 右移窗口
right++;
// 进行窗口内数据的一系列更新
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
char d = s[left];
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}

代码块(点击展开):
class Solution {
public:
int characterReplacement(string s, int k) {
if(s.empty()){
return 0;
}
vector<int> v(26);
// 滑动窗口初始化,右边界每一步都在变化,直到边界
int left = 0, right = 0, maxx = 0;
for(right = 0; right < s.length(); right++){
int temp = s[right] - 'A';
v[temp]++;
maxx = max(v[temp], maxx);
if(right - left + 1 > maxx + k){
v[s[left] - 'A']--;
left++;
}
}
// 返回滑动窗口的大小
return s.length() - left;
}
};
代码
class Solution {
public:
string minWindow(string s, string t) {
vector<int> need(128, 0);
int count = t.length();
for(char c : t){
need[c]++;
}
//start起始下标,size长度
int l = 0, r = 0, start = 0, size = INT_MAX;
while(r < s.size()){
if(need[s[r]] > 0){
count--;
}
need[s[r]]--; //右边的字符加入窗口
if(count == 0){
// 缩减窗口
while(l < r && need[s[l]] < 0){
need[s[l++]]++;
}
if(r - l + 1 < size){
size = r - l + 1;
start = l;
}
need[s[l]]++;
l++;
count++;
}
r++;
}
return size ==INT_MAX? "" : s.substr(start, size);
}
};
代码
class Solution {
public:
int beautifulBouquet(vector<int>& flowers, int cnt) {
int mod = 1e9 + 7;
int ans = 0;
unordered_map<int, int> mp;
for(int l = 0, r = 0; r < flowers.size(); ++r){
mp[flowers[r]]++;
while(mp[flowers[r]] > cnt){
mp[flowers[l]]--;
++l;
}
ans += r - l + 1;
}
return ans % mod;
}
};
posted @   你在学什么  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示