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.
思路一:最小滑动窗口方法,与substring with concatenation of all words的方法类似.
class Solution {
public:
string minWindow(string s, string t) {
string result="";
if(s.empty() || t.empty())
return result;
unordered_map<char,int> map,newMap;
for(int i=0;i<t.length();i++)
map[t[i]]++;
int min=0x7fffffff;
int start=0,end,count=0;
int sLen = s.length(),tLen = t.length();
for(end=0;end<sLen;end++)
{
if(map.find(s[end]) != map.end())
{
if(newMap[s[end]] < map[s[end]])
{
count++;
}
newMap[s[end]]++;
if(count == tLen)
{
while(map.find(s[start]) == map.end() || newMap[s[start]] > map[s[start]])
{
newMap[s[start]]--;
start++;
}
if(end-start+1 < min)
{
min = end-start+1;
result =s.substr(start,min);
}
}
}
}
return result;
}
};