还是使用两个指针扫描字符串S,两个数组标示T中所有字符的出现情况和次数。 后一个指针ed不断扫描找到所有包含T的窗口,找到时从S的初始位置开始利用st指针收缩窗口直到不能收缩为止。 这样可以保证在O(n)的时间内扫描出所有的可能的窗口组合,找到其中最短的即可。
class Solution {
public:
string minWindow(string S, string T) {
int flag[256];
int times[256];
memset( flag,0,sizeof(flag) );
memset( times,0,sizeof(times) );
for( int i=0;i<T.size();i++ )
{
flag[T[i]] = 1;
times[T[i]]++;
}
int TL = T.size();
int MIN = INT_MAX;
int st=0,MinSt=0,ed=0;
for( ;ed<S.size();ed++ )
{
if( flag[S[ed]] == 1 )
{
times[S[ed]]--;
if( times[S[ed]]>=0 )
{
TL--;
}
}
if( TL==0 && flag[S[ed]] == 1 )
{
while(1)
{
if( flag[S[st]]==1 )
{
if( times[S[st]] < 0 )
{
times[S[st]]++;
}
else
{
break;
}
}
st++;
}
if( MIN>ed-st+1 )
{
MIN = ed-st+1;
MinSt = st;
}
}
}
if( MIN == INT_MAX )
{
return "";
}
string res(S,MinSt,MIN);
return res;
}
};