给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案

滑动窗口区间[j, i]

  1. 初始i = j = 0, 直接添加第一个
  2. i永远一步一步来,j根据条件改变,尽量让窗口变小,但是不能不满足条件
  3. 结束的时候是i越界
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
string minWindow(string s, string t) {
string ans = "";
unordered_map<char, int> mp;
for (auto ch : t) mp[ch]++;
unordered_map<char, int> cnt;
int tt = 0;
for (int i = 0, j = 0; i < s.size(); i++) {
cnt[s[i]]++;
if (cnt[s[i]] <= mp[s[i]]) tt++;
while (cnt[s[j]] > mp[s[j]]) {
cnt[s[j]]--;
j++;
}
if (tt == t.size()) {
if (!ans.size() || ans.size() > i - j + 1) {
ans = s.substr(j, i - j + 1);
}
}
}
return ans;
}
};