C++ 最小窗口子串
假设我们有两个字符串 S 和 T。我们需要在 S 中找到包含 T 中所有字符的最小窗口。例如,如果输入字符串为“ABHDAXCVBAGTXATYCB”,而 T = “ABC”,则结果为:“CVBA”。
为了解决这个问题,我们将遵循以下步骤:
创建一个映射 m
将 x 的频率存储到 m 中
length := s 的大小,left := 0,right := 0,ansLeft := 0,ansRight := 0
counter := x 的大小,flag := false,ans := 空字符串
当 height < s 的大小:
c := s[right]
如果 c 存在于 m 中,则
如果 m[c] > 0,则将 counter 减 1
将 m[c] 减 1
当 counter = 0 且 left <= right
如果 right – left + 1 <= length
length := right – left + 1
flag := true
ansLeft := left,ansRight := right
如果 left = right,则跳出循环
c := s[left]
如果 c 存在于 m 中,则将 m[c] 加 1
如果 m[c] > 0,则将 counter 加 1
将 left 加 1
将 right 加 1
如果 flag 为 false,则返回 ans
否则,对于 i 从 ansLeft 到 ansRight,将 s[i] 追加到 ans 中
返回 ans
示例
让我们来看下面的实现,以便更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: string minWindow(string s, string x) { map <char, int> m; for(int i =0;i<x.size();i++)m[x[i]]++; int length = s.size(); int left = 0, right = 0 , ansLeft = 0, ansRight = 0; int counter = x.size(); bool flag = false; string ans = ""; while(right<s.size()){ char c = s[right]; if(m.find(c)!=m.end()){ if(m[c]>0)counter--; m[c]--; } while(counter == 0 && left<=right){ if(right-left+1 <=length){ length = right-left+1; flag = true; ansLeft = left; ansRight = right; } if(left == right)break; c = s[left]; if(m.find(c)!=m.end()){ m[c]++; if(m[c]>0)counter++; } left++; } right++; } if(!flag)return ans; else for(int i =ansLeft;i<=ansRight;i++)ans+=s[i]; return ans; } }; main(){ Solution ob; cout << (ob.minWindow("ABHDAXCVBAGTXATYCB", "ABC")); }
输入
"ABHDAXCVBAGTXATYCB" "ABC"
输出
CVBA
广告