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 = "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.
version 1
class Solution {
public:
string minWindow(string S, string T) {
if(0 == S.size() || 0 == T.size())
return string("");
vector<int> tchars(256);
for(int i = 0; i < T.size(); ++i)
++tchars[T.at(i)];
vector<int> schars(256);
int left = -1, curCount = 0;
string ret(S + T);
for(int i = 0; i < S.size(); ++i)
{
if(T.size() == curCount)
{
while(++left < i)
{
if(0 == tchars[S.at(left)])
continue;
--schars[S.at(left)];
if(schars[S.at(left)] < tchars[S.at(left)])
{
--curCount;
break;
}
}
if(i - left < ret.size())
ret = S.substr(left, i - left);
}
if(0 == tchars[S.at(i)])
continue;
if(schars[S.at(i)] < tchars[S.at(i)])
++curCount;
++schars[S.at(i)];
}
if(T.size() == curCount)
{
while(++left < S.size())
{
if(0 == tchars[S.at(left)])
continue;
--schars[S.at(left)];
if(schars[S.at(left)] < tchars[S.at(left)])
{
--curCount;
break;
}
}
if(S.size() - left < ret.size())
ret = S.substr(left, S.size() - left);
}
return ret.size() > S.size()? "": ret;
}
};
version 2,把代码调整一下,好了很多。还是同样的想法!
class Solution {
public:
string minWindow(string S, string T) {
vector<int> tchars(256);
for(int i = 0; i < T.size(); ++i)
++tchars[T.at(i)];
vector<int> schars(256);
int left = -1, curCount = 0;
string ret(S + T);
for(int i = 0; i < S.size(); ++i)
{
if(0 == tchars[S.at(i)])
continue;
if(schars[S.at(i)] < tchars[S.at(i)])
++curCount;
++schars[S.at(i)];
if(T.size() == curCount)
{
while(++left < i)
{
if(0 == tchars[S.at(left)])
continue;
--schars[S.at(left)];
if(schars[S.at(left)] < tchars[S.at(left)])
{
--curCount;
break;
}
}
if(i - left + 1 < ret.size())
ret = S.substr(left, i - left + 1);
}
}
return ret.size() > S.size()? "": ret;
}
};