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.
Double pointers, greedy algorithms are obvious, however, I wrote a disgusting code like this:
class Solution {
public:
string minWindow(string S, string T) {
map<char, int> Tmap;
if (T.length() == 0)
return "";
int i, r = 0, l = 0, minSize = S.length() + 1, minl = 0, minr = 0, find = 0;
for (i = 0; i < T.length(); ++i)
if (Tmap.find(T[i]) == Tmap.end())
Tmap.insert(make_pair(T[i],1));
else
++Tmap[T[i]];
for (r = 0; r < S.length(); ++r) {
if (Tmap.find(S[r]) != Tmap.end())
--Tmap[S[r]];
if (r - l + 1 < T.length())
continue;
map<char, int>::iterator it = Tmap.begin();
for (; it != Tmap.end() && it->second <= 0; ++it);
if (it == Tmap.end()) {
find = 1;
break;
}
}
if (find) {
minl = l;
minr = r;
minSize = r - l + 1;
}
while (find && r < S.length()) {
for (; r - l + 1 >= T.length(); ++l)
if (Tmap.find(S[l]) != Tmap.end()) {
++Tmap[S[l]];
if (Tmap[S[l]] > 0)
break;
}
if (r - l + 1 == T.length()) {
minl = l;
minr = r;
minSize = r - l + 1;
break;
}
else
++Tmap[S[l++]];
if (r - l + 2 < minSize) {
minl = l - 1;
minr = r;
minSize = r - l + 2;
}
for (; r < S.length() && S[l - 1] != S[r]; ++r)
if (Tmap.find(S[r]) != Tmap.end())
--Tmap[S[r]];
--Tmap[S[r]];
}
if (minSize > S.length())
return "";
else
return S.substr(minl, minSize);
}
};
Too many bugs hinder me from passing this problem. Some comments about this code :
1. Breaking a loop may have many reasons, so doing sth. based on the loop index after a loop is unconscionable unless the condition of loop is simple.
2. One variable is simpler than judging an array.
3. Two arrays are better.
4. Since the size of char is 8 bits, an array of 260 is enough instead of a map.
The following is a optimized code:
class Solution {
public:
string minWindow(string S, string T) {
int Tmap[260] = {0}, Smap[260] = {0};
if (T.length() == 0 || S.length() < T.length())
return "";
int i, j, l, r, count = 0, target = T.length(), minSize = S.length() + 1, minl = 0;
for (i = 0; i < T.size(); ++i)
++Tmap[T[i]];
for (r = 0, l = 0; r < S.size(); ++r) {
++Smap[S[r]];
if (Smap[S[r]] <= Tmap[S[r]])
++count;
if (count == target) {
for (; r - l + 1 >= target && count == target; ++l) {
--Smap[S[l]];
if (Smap[S[l]] < Tmap[S[l]])
--count;
}
if (r - (l - 1) + 1 < minSize) {
minSize = r - l +2;
minl = l - 1;
}
}
}
if (minSize > S.length())
return "";
else
return S.substr(minl, minSize);
}
};