假设我们有一个字符串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