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 empty string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
思路:问题可以转变为,T中各个字符的数量<= window中的这些字符的数量,所以用map纪录字符与字符数量的关系
class Solution {
public:
bool ifContain(map<char,int>& source, map<char,int>& target) //check if S contains T
{
for(map<char,int>::iterator it = target.begin(); it != target.end(); it++) //map的遍历
{
if(source[it->first] < it->second) return false;
}
return true;
} string minWindow(string S, string T) {
int minLength = INT_MAX;
int start = , end = , minStart = , minEnd = ;
map<char,int> source;
map<char,int> target;
source[S[start]]++; //map的插入[法I]source[key]=value; [法II]source.insert(make_pair(key,value));
for(int i = ; i< T.length(); i++)
{
target[T[i]]++;
}
while()
{
if(ifContain(source, target)){
if(end-start+ < minLength)
{
minStart = start;
minEnd = end;
minLength = end-start+;
if(minLength == T.size()) return S.substr(minStart,minLength);
}
source[S[start]]--; //寻找更小的窗口
start++;
}
else //不包含,则扩大窗口
{
end++;
if(end==S.size()) break;
source[S[end]]++;
}
}
if(minLength>S.size()) return "";
else return S.substr(minStart,minLength);
}
};