类似题
(滑动窗口,哈希表)Leetcode030串联所有单词的字串:
https://blog.csdn.net/qq_52934831/article/details/121443501?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163870610216780265458624%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163870610216780265458624&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-1-121443501.pc_v2_rank_blog_default&utm_term=030&spm=1018.2226.3001.4450
地址
https://leetcode-cn.com/problems/minimum-window-substring/submissions/
描述
思想
疑问?为什么不用if
解释举例:
代码
class Solution {
public:
string minWindow(string s, string t) {
//hs存放s字符串中字符出现次数,ht存放t字符串中字符出现次数
unordered_map<char,int> hs,ht;
for(int i=0;i<t.length();i++) ht[t[i]]++;
int cnt=0;
string res;
for(int i=0,j=0;i<s.length();i++){
//不管有不有效,出现次数都得加
hs[s[i]]++;
//假如++完后,hs[s[i]]<=ht[s[i]],说明这是有效字符
if(hs[s[i]]<=ht[s[i]]) cnt++;
//说明这是无效字符,注意这里是while不是if,j可以连续++
//举个例子s="abbaa",t="aa"
while(hs[s[j]]>ht[s[j]]) hs[s[j++]]--;
if(cnt==t.size()){
//取长度最小的字符串
if(res.empty()||i-j+1<res.size()){
res=s.substr(j,i-j+1);
}
}
}
return res;
}
};