class Solution {
public:
/**
* @param source : A string
* @param target: A string
* @return: A string denote the minimum window, return "" if there is no such a string
*/
string minWindow(string &source , string &target) {
// write your code here
if (source.empty())
{
return "";
}
int ssize=source.size();
int tsize=target.size();
int tcount[128];
int scount[128];//移动窗内相应字符的数量;
for (int i=0;i<128;i++)
{
scount[i]=0;
tcount[i]=0;
}
for (int j=0;j<tsize;j++)
{
tcount[target[j]]++;
}
int begin=-1,end=ssize,found=0,minLen=ssize;//初始化移动窗起始、终止位置、寻找过程中的子串累积长度,最小移动窗长度;
for (int i=0,start=0;i<ssize;i++)
{
scount[source[i]]++;//遍历源串,如果这个字符的数量加1后不超过目标串中该字符的数量,则找到了一个匹配字符,found+1;
if (scount[source[i]]<=tcount[source[i]])
{
found++;
}
if (found==tsize)//找到一个子串;
{
while(start<i&&scount[source[start]]>tcount[source[start]])//去掉无效字符,缩短移动窗长度;
{ //两种情况:窗内存在该字符但目标中不存在,舍弃。另一种窗内该字符数量超过目标中数量,舍弃;
scount[source[start]]--;//移动窗内去掉这个字符;
start++;//继续向前判断;
}
//最后的结果是start对应的字符是目标中的某个字符;
if (i-start<minLen)
{
minLen=i-start;
begin=start;
end=i;
}
//移动窗在源串上前移一位(舍弃起始字符),继续寻找子串;
scount[source[start]]--;
found--;
start++;
}
}
if (begin==-1)
{
return "";
}
else
{
return source.substr(begin,minLen+1);
}
}
};