Minimum Window Substring
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 =
T =
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 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 {//beware of duplicates!
struct Pair{int pos; char c;Pair(int a,char b):pos(a),c(b){}};
public:
//expand the end index of the window of S one char at a time
//at the same time, try to shrink the front index as much as possible
//while keep the window containing all T-char's
string minWindow(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (S.length() < T.length()) return "";
vector<int> isT(300, false);//used to quick check if is a T-char, and count dups!
for(int ii = 0; ii < T.length(); ++ii){
++isT[T[ii]];
}
int wStart = 0;//window start pos
while(!isT[S[wStart]] && wStart < S.length()){++wStart;}
if (wStart == S.length()) return "";
int house = 0;//0 T-char so far
int const fullHouse = T.length();//total
//indicate if all T-char's are in the window
string result(S);
vector<int> countT(300,0);//count occurance in the window
deque<Pair> posChar;//the positions of the T-char in window
for(int wEnd = wStart; wEnd < S.length(); ++wEnd){
char const sChar = S[wEnd];
if (isT[sChar]){
posChar.push_back(Pair(wEnd, sChar));//register position and T-char
if(countT[sChar] < isT[sChar]) ++house;//register new/dup T-char showing up
++countT[sChar];//register count of this T-char
if (fullHouse == house && result.size() > (wEnd-wStart+1)) result = S.substr(wStart, wEnd-wStart+1);
//full house and short window, potential result!
if (countT[sChar] > isT[sChar]){
//if sChar shows more than in T in the window
//the window may be qualified for shrinking
while(!posChar.empty()){
wStart = posChar.front().pos;
char wChar = posChar.front().c;
if (fullHouse == house && result.size() > (wEnd-wStart+1)) result = S.substr(wStart, wEnd-wStart+1);
if (countT[wChar] > isT[wChar]){
--countT[wChar];//once full house, always full house
posChar.pop_front();
continue;
}else break;
}//while posChar not empty
}//if count > 1
}else{//redundent char, not in T-char, not optimal for result
continue;
}//if-else
}//for wEnd
if (fullHouse != house) return "";
return result;
}
};
No comments:
Post a Comment