给定一个字符串 S 和一个字符串 T,找到 S 中的最小窗口,它将包含复杂度为 O(n) 的 T 中的所有字符。
示例:
S = "ADOBECODEBANC"
T = "ABC"
最小窗口是 "BANC".
注意事项:
如果 S 中没有覆盖 T 中所有字符的窗口,则返回空字符串 ""。
如果有多个这样的窗口,你将会被保证在 S 中总是只有一个唯一的最小窗口。
详见:https://leetcode.com/problems/minimum-window-substring/description/
class Solution { public: string minWindow(string s, string t) { if (t.size() > s.size()) { return ""; } string res = ""; int left = 0; int count = 0; int minLen = s.size() + 1; unordered_map<char, int> m; for (int i = 0; i < t.size(); i++) { if (m.find(t[i]) != m.end()) { ++m[t[i]]; } else { m[t[i]] = 1; } } for (int right = 0; right < s.size(); right++) { if (m.find(s[right]) != m.end()) { --m[s[right]]; if (m[s[right]] >= 0) { ++count; } while (count == t.size()) { if (right - left + 1 < minLen) { minLen = right - left + 1; res = s.substr(left, minLen); } if (m.find(s[left]) != m.end()) { ++m[s[left]]; if (m[s[left]] > 0) { --count; } } ++left; } } } return res; } };
详见:https://www.cnblogs.com/grandyang/p/4340948.html