思路:滑窗 O(n)
难点:
1:如何判断r移动后包含了t中所有的字符?
还款机制,t中的元素++,窗口内的元素–,当–后>=0则表示一次有效还款 cnt++,当cnt==t.size()时,包括了t中所有字符
2:窗口内始终包含t中所有字符,否则r一直右移。
class Solution {
public:
string minWindow(string s, string t) {
int n = s.size(), m = t.size();
if (n < m) return "";
int l = 0, ansl = -1, anslen = INT_MAX, cnt = 0;
int flag[128] = {0};
for (auto& ch : t) flag[ch]++;
for (int r = 0; r < n; ++r) {
if (--flag[s[r]] >= 0) cnt++;
while (cnt == m && flag[s[l]] < 0) {
flag[s[l++]]++;
}
if (cnt == m && r - l + 1 < anslen) {
ansl = l;
anslen = r - l + 1;
}
}
return ansl == -1 ? "" : s.substr(ansl, anslen);
}
};