C ++中的最小窗口子字符串
假设我们有一个字符串S和T。我们必须在S中找到将包含T中所有字符的最小窗口。因此,如果输入类似于“ABHDAXCVBAGTXATYCB”和T=“ABC”,那么结果将是:CVBA”。
为了解决这个问题,我们将遵循以下步骤-
创建一张映射
将x的频率存储到m
长度:=s的大小,左:=0,右:=0,ansLeft:=0和ansRight:=0
counter:=x的大小,flag:=false,ans:=空字符串
而高度<s的大小-
如果是右–左+1<=长度
如果left=right,则打破循环
c:=s[左]
如果c存在于m中,则将m[c]加1
如果m[c]>0,则将计数器增加1
向左增加1
长度:=右–左+1
标志:=true
ansLeft:=左,ansRight:=右
如果m[c]>0,则将计数器减1
将m[c]减少1
c:=s[正确]
如果c存在于m中,则
而counter=0且左<=右
向右增加1
如果flag为false,则返回ans
否则,对于范围在ansLeft至ansRight中的i,将ans增加s[i]
返回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