76、覆盖最小子串
题目:
解答:
哈希表tmap存储t中出现的字符和其出现次数。
本题中最后需要return最小的字符串,因此需要获得左右窗口端点,用ansleft ansright保存。
维护窗口[left,right],用cnt统计tmap中不为0的字符个数。right遍历时将tmap中对应字符-1,直到其为0,表明该字符个数已经足够,那么cnt--。
当cnt==0时,说明所有字符个数都够了。那么窗口已经满足条件,更新ansleft和ansright。
开始移动left,试图寻找更小的窗口,同时更新tmap、cnt,如果还是满足cnt==0那么继续更新ansleft和ansright。
right遍历,最后如果一个满足的窗口都没找到,那么left为初始值,此时return ""即可,否则return s中相应的字符串。
class Solution {
public:string minWindow(string s, string t) {unordered_map<char,int> tmap;int slen = s.size();int tlen = t.size();for(int i = 0 ;i<tlen;i++){tmap[t[i]]++;}int cnt = tmap.size();int left = 0,right = 0,ansleft=-1,ansright=slen;for(right;right<slen;right++){if(tmap.contains(s[right])){tmap[s[right]]--;if(tmap[s[right]]==0){cnt--;}}while(cnt==0){if(ansright-ansleft>right-left){ansright=right;ansleft=left;}if(tmap.contains(s[left])){if(tmap[s[left]]==0)cnt++;tmap[s[left]]++;}left++;}}return ansleft==-1 ? "" : s.substr(ansleft,ansright-ansleft+1);}
};
时间复杂度O(m+n) 需要分别遍历两个数组
空间复杂度O(C) C为数据集字符个数