题意 :
思路:采用滑动窗口,窗口有左右边界,先通过扩展右边界找出一个包含T中所有字符的子串,然后收缩左边界,直到不能再收缩。记录此时的子串。然后收缩左边界,继续扩展右边界,直到再找到满足要求的子串,和上次的进行比较,保存更小的子串。返回执行,直到右边界到达S串尾,且左边界不能再收缩。
C++代码:
class Solution {
public:
string minWindow(string s, string t) {
map<char,int> mp;
for(auto & s:t)
mp[s]++; // map的key是匹配的字母, value还需要匹配的次数
int left = 0,right = -1;
string res = "";
int len = s.size()+1;
int count = 0; // 在t中匹配的字母个数
while(left<s.size())
{
if(right+1<s.size() && count<t.size())
{
right++;
if(mp.find(s[right])!=mp.end())
{
if(mp[s[right]]>0)
{
count++;
}
mp[s[right]]--;
}
}
else
{
if(mp.find(s[left])!=mp.end())
{
if(mp[s[left]]==0)
{
count--;
}
mp[s[left]]++;
}
left++;
}
if(count == t.size())
{
if(right - left +1 < len)
{
len = right-left+1;
res = s.substr(left,right-left+1);
}
}
}
return res;
}
};