题目:
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.
分析:
1 首先预处理T,用一个128长的整数数组arrayT存储里面每个char的个数
2然后给定两个指标i和j,也用一个128长的整数数组arrayS记录从i到j的这段字符串里面每个char的个数。如果arrayT大于等于arrayS,也就是说arrayT里的每一位大于等于arrayS里相应位置的值,那么我们就记录当前i和j的长度,如果比已经记录的小,那么我们就选这个位最小窗口,记录i和j。然后让i往前走一位。如果arrayT不大于等于pattern,那么让j往前走一位。
代码如下:
bool compair(int *l,int *r)
{for(int i=0;i<128;i++)
{
if(l[i]>r[i])
{
return false;
}
}
return true;
}
string minWindow(string S, string T)
{
if(S.length()<T.length())
{
string tmp;
return tmp;
}
int arrayT[128];
int arrayS[128];
vector<int> pairdot;
for(int i=0;i<128;i++)
{
arrayT[i]=0;
arrayS[i]=0;
}
for(int i=0;i<T.length();i++)
{
arrayT[T[i]]++;
}
int i=0,j=0;
while(i<S.length())
{
if(compair(arrayT,arrayS))
{
if(pairdot.size()>0)
{
if(pairdot[2]>j-i)
{
pairdot[0]=i;
pairdot[1]=j-1;
pairdot[2]=j-i;
}
}
else
{
pairdot.push_back(i);
pairdot.push_back(j-1);
pairdot.push_back(j-i);
}
i++;
arrayS[S[i-1]]--;
}
else
{
if(j<S.length())
{
arrayS[S[j]]++;
j++;
}
else
{
break;
}
}
}
string result;
if(pairdot.size()>0)
{
for(int i=pairdot[0];i<=pairdot[1];i++)
{
result+=S[i];
}
}
return result;
}