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.
» Solve this problem
[解题报告]
双指针,动态维护一个区间。尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符后,然后再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的
class Solution {
public:
string minWindow(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sLen=S.size();
int tLen=T.size();
if(tLen==0 || sLen<tLen) return "";
int needFind[256]={0};
int hasFind[256]={0};
for(int i=0;i<tLen;i++)
{
needFind[T[i]]++;
}
int minWindowLength=INT_MAX;
int minBegin=0;
int minEnd=sLen-1;
int begin=0;
int end=0;
for(int count=0;end<sLen;end++)
{
//skip those not in T
if(needFind[S[end]]==0) continue;
hasFind[S[end]]++;
//update the total number of characters found(aaa only counts 2 for aa in T)
if(hasFind[S[end]] <= needFind[S[end]])
count++;
//a window exists from begin to end
if(count==tLen)
{
//move begin pointer to find the minimum window
while(begin<end)
{
if(needFind[S[begin]]==0)
{
begin++;
continue;
}
if(hasFind[S[begin]] > needFind[S[begin]])
{
hasFind[S[begin]]--;
begin++;
continue;
}
else
break;
}
int tmpWindowLength=end-begin+1;
if(tmpWindowLength < minWindowLength)
{
minBegin=begin;
minEnd=end;
minWindowLength=tmpWindowLength;
}
}
}
if(minWindowLength==INT_MAX)
return "";
return S.substr(minBegin,minWindowLength);
}
};