76. 最小覆盖子串
给你一个字符串
s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。 注意:如果s中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”**
示例 2:
输入:s = “a”, t = “a”
输出:“a”提示:
1 <= s.length, t.length <= 10s和t由英文字母组成进阶:你能设计一个在
o(n)时间内解决此问题的算法吗?
解题思路
滑动窗口
class Solution {public:string minWindow(string s, string t) {unordered_map<char,int>need;//t字符串unordered_map<char,int>window;//滑动窗口里包含的t里每个字符及其数量for ( char c : t) need[c]++;int left = 0,right = 0;//滑动窗口的左右边界int valid = 0;//表示window内包含t所需的个数int start = 0,len = INT_MAX;while (right < s.size()) {//[left,right)char c = s[right];//c是将移入窗口的字符right++;//右移窗口//进行窗口内一系列数据的更新if (need.count(c)) {//c属于t里的字符window[c]++;if (window[c] == need[c])valid++;}//判断左侧窗口是否要收缩while (valid == need.size()) {//在这里更新最小覆盖子串if (right - left < len) {//可能有多个满足的len,要取最小的start = left;len = right - left;}char d = s[left];//d是将移出窗口的字符left++;//左移窗口//进行窗口内一系列数据的更新if (need.count(d)) {if (window[d] == need[d])valid--;window[d]--;}}}//返回最小覆盖字串return len == INT_MAX ? "" : s.substr(start,len);}};
