Two Pointer
右邊一直走
若達成substring window條件, left再開始走, 直到不構成window
特別情況是, 字元過多的時候, 要允許window內出現次數出現負數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Solution { public: string minWindow(string s, string t) { std::unordered_map<char, int> chrMap; for (char c : t) chrMap[c]++; int ansLeft; int ansLen = INT_MAX; int cnt = 0; int left = 0; int right = 0; for (; right < s.size(); right++) { if (chrMap.count(s[right])) { if (chrMap[s[right]] > 0) cnt++; chrMap[s[right]]--; } while (cnt == t.size()) { if (right - left + 1 < ansLen) { ansLeft = left; ansLen = right - left + 1; } if (chrMap.count(s[left])) { chrMap[s[left]]++; if (chrMap[s[left]] > 0) cnt--; } left++; } } if (ansLen == INT_MAX) return ""; return s.substr(ansLeft, ansLen); } }; |