題意 :
思路:採用滑動窗口,窗口有左右邊界,先通過擴展右邊界找出一個包含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;
}
};