Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
class Solution {
public:
string minWindow(string S, string T) {
string result;
const int N=256;
int l1=S.length(),l2=T.length(),tmp=0,counter=0,min=l1+1;
if(l1<l2){
return result;
}
vector<int> num(N,0);
vector<int> visited(N,0);
for(int i=0;i<l2;i++){
num[T[i]]++;
}
int i=0,j=-1;
while(i<=l1-l2&&j<l1){
if(!num[S[i]]){
i++;
continue;
}
while(j<l1&&counter!=l2){
j++;
tmp=S[j];
if(visited[tmp]<num[tmp]){
counter++;
}
visited[tmp]++;
}
if(counter==l2){
tmp=j-i+1;
if(tmp<min){
min=tmp;
result.assign(S,i,tmp);
}
tmp=S[i];
if(visited[tmp]>0){
visited[tmp]--;
}
if(visited[tmp]<num[tmp]&&counter>0){
counter--;
}
i++;
}
}
return result;
}
};