给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
解析:使用双端指针即可。移动right一直到满足条件,满足时再移动left求得最短结果。
最好的详解:滑动窗口算法通用思想
class Solution {
public:
string minWindow(string s, string t) {
int left = 0,right = 0;
int len = INT_MAX;
string str = "";
unordered_map<char,int> map_s;
unordered_map<char,int> map_t;
for(auto ch:t)
map_t[ch]++;
int match = 0;
while(right < s.length()){
char c1 = s[right];
if(map_t.count(c1)){//有t中元素时才统计
map_s[c1]++;
if(map_s[c1] == map_t[c1])//只能等于时加一次
match++;
}
right++;
while(match==map_t.size() && left<=right){
if(right-left < len){
len = right-left;
str = s.substr(left,len);
}
char c2 = s[left];
if(map_t.count(c2)){
map_s[c2]--;
if(map_s[c2] < map_t[c2])//小于时match才减一
match--;
}
left++;
}
}
return len==INT_MAX?"":str;
}
};