Giả sử chúng ta có một chuỗi S và T. Chúng ta phải tìm cửa sổ tối thiểu trong S chứa tất cả các ký tự trong T. Vì vậy, nếu đầu vào là “ABHDAXCVBAGTXATYCB” và T =“ABC”, thì kết quả sẽ là:“ CVBA ”.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Tạo một bản đồ m
-
lưu tần số của x thành m
-
length:=size of s, left:=0, right:=0, ansLeft:=0 và ansRight:=0
-
counter:=size of x, flag:=false, ans:=blank string
-
trong khi chiều cao
-
c:=s [right]
-
nếu c có trong m thì
-
nếu m [c]> 0, thì giảm bộ đếm đi 1
-
giảm m [c] đi 1
-
-
trong khi counter =0 và left <=right
-
nếu phải - trái + 1 <=length
-
length:=right - left + 1
-
cờ:=true
-
ansLeft:=left, ansRight:=right
-
-
nếu left =right, thì ngắt vòng lặp
-
c:=s [left]
-
nếu c có trong m thì tăng m [c] thêm 1
-
nếu m [c]> 0, thì tăng bộ đếm lên 1
-
tăng bên trái 1
-
-
tăng quyền lên 1
-
-
nếu cờ sai, thì trả về ans
-
ngược lại đối với tôi trong phạm vi ansLeft to ansRight, hãy tăng ans lên s [i]
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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"));
} Đầu vào
"ABHDAXCVBAGTXATYCB" "ABC"
Đầu ra
CVBA