classSolution { public: string minWindow(string s, string t){ unordered_map<char, int> need, window; for (char c : t) need[c]++;
int left = 0, right = 0; int valid = 0; int start = 0, len = INT_MAX; // len 赋值为极大值,如果所有字符都不满足,则输出空字符串 while (right < s.size()) { // c 是将移入窗口的字符 char c = s[right]; // 右边界右移 right++; // 进行窗口内数据的一系列更新 // 统计当前窗口中出现所需字母的次数 // 如果出现了所有字符,那么 valid == need.size() if (need.count(c)) { window[c]++; if (need[c] == window[c]) { valid++; } }
// 判断左侧窗口是否要收缩 while (valid == need.size()) { if (right - left < len) { start = left; len = right - left; } // d 是将移出窗口的字符 char d = s[left]; // 左移窗口 left++; if (need.count(d)) { if (need[d] == window[d]) { valid--; } window[d]--; } } } return len == INT_MAX ? "" : s.substr(start, len); } };