给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”
注意:
- 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量
- 如果 s 中存在这样的子串,我们保证它是唯一的答案
滑动窗口区间[j, i]
- 初始i = j = 0, 直接添加第一个
- i永远一步一步来,j根据条件改变,尽量让窗口变小,但是不能不满足条件
- 结束的时候是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; } };
|