**提示:**
* `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)]