https://www.cnblogs.com/grandyang/p/4340948.html
O(n)的时间复杂度
滑动窗口
存储t中所有的字符和对应出现的次数。然后从s的头部开始滑动,遇到一个t中的字符就减一次,并且只要是次数大于0的情况,肯定是成功匹配了一个字符。直到所有成功匹配的字符个数等于t的个数,实际上也就是全都匹配了,再滑动最左边的位置。如果有一个字符的次数大于0了,说明现在滑动的位置已经缺字符了,又继续滑动右边的边界。
class Solution { public: string minWindow(string s, string t) { unordered_map<char,int> m; for(int i = 0;i < t.size();i++) m[t[i]]++; string res = ""; int left = 0,count = 0,length = INT_MAX; for(int i = 0;i < s.size();i++){ if(--m[s[i]] >= 0) count++; while(count == t.size()){ if(i - left + 1 < length){ res = s.substr(left,i - left + 1); length = i - left + 1; } if(++m[s[left]] > 0) count--; left++; } } return res; } };