滑动窗口算法 Leetcode 076最小覆盖字串(核心思想:哈希表,有效字符cnt的统计)(类似Leetcode 030)

类似题

(滑动窗口,哈希表)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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_52934831/article/details/121734390