Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
Example:
Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"
Note:
If there is no such window in S that covers all characters in T, return the empty string "".
If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
滑动窗口算法可解,用vector代替哈希表获得更快的速度,遍历s串时相应增加cnt,找到符合要求的window后开始缩小左边界,cnt不符合要求时扩大右边界。关键点是要先找到符合要求的window。
class Solution {
public:
string minWindow(string s, string t) {
vector stats(128, 0);
int cnt = 0, left = 0, minLen = INT_MAX;
string res = "";
for (char c : t) stats[c]++;
for (int i = 0; i < s.size(); i++) {
if (--stats[s[i]] >= 0) cnt++;
while (cnt == t.size()) {
//找到符合要求的window后再缩小左边界
if (i - left + 1 < minLen) {
minLen = i - left + 1;
res = s.substr(left, minLen);
}
if (++stats[s[left]] > 0) cnt--;
left++;
}
}
return res;
}
};