滑动窗口
思路
- 在字符串s中使用双指针中的左右指针技巧,初始化left = right = 0,把索引左闭右开区间[left, right)称为一个窗口。
- 先不断增加right指针扩大窗口,直到窗口中的所有字符串符合要求寻找可行解()
- 此时,我们停止增加right,转而不断增加left缩小指针窗口,直到窗口中的字符串不再符合要求,同时,每次增加left,都要更新一轮结果。(优化可行解)
- 重复第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()) { |
| |
| |
| char c = s[right]; |
| |
| right++; |
| |
| |
| |
| while (window needs shrink) { |
| |
| 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]++; |
| } |
| |
| 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; |
| } |
| }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~