मान लीजिए हमारे पास एक स्ट्रिंग एस और टी है। हमें एस में न्यूनतम विंडो ढूंढनी है जिसमें टी में सभी वर्ण होंगे। इसलिए यदि इनपुट "ABHDAXCVBAGTXATYCB" और T ="ABC" जैसा है, तो परिणाम होगा:" सीवीबीए”।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक नक्शा बनाएं मी
-
x की आवृत्ति को m में संग्रहित करें
-
लंबाई:=s का आकार, बाएँ:=0, दाएँ:=0, उत्तर बाएँ:=0 और उत्तर दाएँ:=0
-
काउंटर:=x का आकार, ध्वज:=झूठा, उत्तर:=खाली स्ट्रिंग
-
जबकि ऊंचाई
-
सी:=एस [दाएं]
-
अगर c m में मौजूद है, तो
-
अगर m[c]> 0, तो काउंटर को 1 से कम करें
-
m[c] को 1 से कम करें
-
-
जबकि काउंटर =0 और बाएँ <=दाएँ
-
अगर दाएं - बाएं + 1 <=लंबाई
-
लंबाई :=दाएँ-बाएँ + 1
-
झंडा :=सच
-
उत्तर बाएँ:=बाएँ, उत्तर दाएँ:=दाएँ
-
-
अगर बाएँ =दाएँ, तो लूप तोड़ें
-
सी:=एस [बाएं]
-
यदि c m में मौजूद है, तो m[c] को 1 से बढ़ा दें
-
अगर m[c]> 0, तो काउंटर को 1 से बढ़ा दें
-
बाईं ओर 1
. बढ़ाएं
-
-
1
. द्वारा सही बढ़ाएं
-
-
अगर झंडा गलत है, तो जवाब वापस करें
-
अन्यथा के लिए मैं उत्तर की सीमा में उत्तर के लिए बाएं, एस द्वारा उत्तर बढ़ाएं [i]
-
वापसी उत्तर
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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