LeetCode 76


**提示:**


* `1 <= s.length, t.length <= 105`
* `s` 和 `t`由英文字母组成


**进阶:** 你能设计一个在  
 
 
 
 
 o 
 
 
 ( 
 
 
 n 
 
 
 ) 
 
 
 
 o(n) 
 
 
 o(n)时间内解决此问题的算法吗?


#### 2、思路


**(滑动窗口)**  
 
 
 
 
 O 
 
 
 ( 
 
 
 n 
 
 
 ) 
 
 
 
 O(n) 
 
 
 O(n)


这道题要求我们返回字符串`s`中包含字符串 `t` 的全部字符的最小窗口,我们利用滑动窗口的思想解决这个问题。因此我们需要两个哈希表,`hs`哈希表维护的是`s`字符串中滑动窗口中各个字符出现多少次,`ht`哈希表维护的是`t`字符串各个字符出现多少次。如果`hs`哈希表中包含`ht`哈希表中的所有字符,并且对应的个数都不小于`ht`哈希表中各个字符的个数,那么说明当前的窗口是**可行**的,可行中的长度最短的滑动窗口就是答案。


![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37IC3R5D-1626072093263)(力扣500题刷题笔记.assets/image-20210710110429726.png)]](https://img-blog.csdnimg.cn/186b54f0642548d3abe08d0d6e0de7f1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyOTI4NQ==,size_16,color_FFFFFF,t_70)


**过程如下:**


1、遍历`t`字符串,用`ht`哈希表记录`t`字符串各个字符出现的次数。


![](https://img-blog.csdnimg.cn/20210712144307366.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyOTI4NQ==,size_16,color_FFFFFF,t_70)


2、定义两个指针`j`和`i`,`j`指针用于收缩窗口,`i`指针用于延伸窗口,则区间`[j,i]`表示当前滑动窗口。首先让`i`和`j`指针都指向字符串`s`开头,然后枚举整个字符串`s` ,枚举过程中,不断增加`i`使滑动窗口增大,相当于向右扩展滑动窗口。


![](https://img-blog.csdnimg.cn/20210712144322988.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyOTI4NQ==,size_16,color_FFFFFF,t_70)


3、每次向右扩展滑动窗口一步,将`s[i]`加入滑动窗口中,而新加入了`s[i]`,相当于滑动窗口维护的字符数加一,即`hs[s[i]]++`。


![](https://img-blog.csdnimg.cn/20210712144458171.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyOTI4NQ==,size_16,color_FFFFFF,t_70)


4、对于新加入的字符`s[i]`,如果`hs[s[i]] <= ht[s[i]]`,说明当前新加入的字符`s[i]`是必需的,且还未到达字符串`t`所要求的数量。我们还需要事先定义一个`cnt`变量, `cnt`维护的是`s`字符串`[j,i]`区间中满足`t`字符串的元素的个数,记录相对应字符的总数。新加入的字符`s[i]`必需,则`cnt++`。


5、我们向右扩展滑动窗口的同时也不能忘记收缩滑动窗口。因此当`hs[s[j]] > ht[s[j]`时,说明`hs`哈希表中`s[j]`的数量多于`ht`哈希表中`s[j]`的数量,此时我们就需要向右收缩滑动窗口,`j++`并使`hs[s[j]]--`,即`hs[s[j ++ ]] --`。


6、当`cnt == t.size`时,说明此时滑动窗口包含符串 `t` 的全部字符。我们重复上述过程找到最小窗口即为答案。


![](https://img-blog.csdnimg.cn/72c86299113e437ca087ad382e455b3a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyOTI4NQ==,size_16,color_FFFFFF,t_70)


#### 3、c++代码



class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> hs, ht;
for (auto c: t) ht[c] ++ ;

    string res;
    int cnt = 0;
    for (int i = 0, j = 0; i < s.size(); i ++ ) {
        hs[s[i]] ++ ;
        if (hs[s[i]] <= ht[s[i]]) cnt ++ ;

        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;
}

};


#### 4、java代码



class Solution {

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

…(img-uOu6LJNa-1714413550938)]

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

[外链图片转存中…(img-22Fz8p9O-1714413550938)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值