滑动窗口算法 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值