ধরুন আমাদের একটি স্ট্রিং S এবং T আছে। আমাদের S-তে ন্যূনতম উইন্ডোটি খুঁজে বের করতে হবে যাতে T-এর সমস্ত অক্ষর থাকবে। সুতরাং ইনপুট যদি হয় “ABHDAXCVBAGTXATYCB” এবং T =“ABC”, তাহলে ফলাফল হবে:“ CVBA”।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি মানচিত্র তৈরি করুন m
-
x এর ফ্রিকোয়েন্সি m
এ সংরক্ষণ করুন -
দৈর্ঘ্য :=s এর আকার, বাম :=0, ডান :=0, ansLeft :=0 এবং ansRight :=0
-
counter :=x এর আকার, পতাকা :=মিথ্যা, উত্তর :=খালি স্ট্রিং
-
যখন উচ্চতা
-
c :=s[ডান]
-
যদি c থাকে m, তাহলে
-
যদি m[c]> 0 হয়, তাহলে কাউন্টার 1
কমিয়ে দিন -
1
দ্বারা m[c] হ্রাস করুন
-
-
যখন কাউন্টার =0 এবং বাম <=ডান
-
যদি ডান - বাম + 1 <=দৈর্ঘ্য
-
দৈর্ঘ্য :=ডান - বাম + 1
-
পতাকা :=সত্য
-
ansLeft :=left, ansRight :=right
-
-
যদি বাম =ডান, তাহলে লুপ ভাঙুন
-
c :=s[বাম]
-
যদি m এ c থাকে, তাহলে m[c] 1
দ্বারা বাড়ান -
যদি m[c]> 0 হয়, তাহলে কাউন্টার 1 দ্বারা বাড়ান
-
1 দ্বারা বাম বাড়ান
-
-
ডান 1 দ্বারা বাড়ান
-
-
যদি পতাকা মিথ্যা হয়, তাহলে উত্তর দিন
-
অন্যথায় i রেঞ্জের জন্য উত্তর বাম থেকে উত্তর, s[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