76.最小覆盖子串
思路:我们先用哈希表mp来存储字符串t中字符的数量。然后再遍历字符串s,找到最小的滑动窗口,它包含字符串t中所有的字符。
这里机智的地方就在于cnt,它保存了字符串t中存在的字符个数,这样就可以知道什么时候滑动窗口包含字符串t中所有的字符(即,cnt=0的时候)
class Solution {
public:
string minWindow(string s, string t) {
int cnt=0;
unordered_map<char,int> mp;
for(int i=0;i<t.size();i++){
mp[t[i]]++;//记录字符串t里的每个字符的数量
if(mp[t[i]]==1){//第一次记录时,标记一下有多少种字符
cnt++;
}
}
int f=0;
string tmp="";//保存最短的字符串,默认为空串
int flag=100010;//保存最短字符串的长度
for(int i=0;i<s.size();i++){
mp[s[i]]--;//记录字符串s中的字符个数
if(mp[s[i]]==0) cnt--;//当该字符对应的数量为0时,说明f~i这段s的字符串对上了字符串t中字符s[i]的数量
while(mp[s[f]]<0){//当s[f]所对应的字符的数量<0,说明f~i存在多余的长度
mp[s[f++]]++;
}
if(cnt==0){//来更新最短的字符串
if(flag>i-f+1){
flag=i-f+1;
tmp=s.substr(f,flag);
}
}
}
return tmp;
}
};