leetcode 76.最小覆盖子串

题目:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
示例1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
示例2:
输入: s = “a”, t = “aa”
输出: “”
方法及思路:
采用双指针滑动窗口方法,用两个哈希表,一个哈希表存放t中所有字符以及它们的个数;一个哈希表动态存放滑动窗口中包含t的字符和对应字符的个数。
代码:

class solution{
public:
	unordered_map<char,int> need, window;
	//检查滑动窗口是否是可行窗口,即滑动窗口中包含t中所有字符,且对应字符的个数均不小于t中字符的个数
	bool check(){
		for(const auto &p:need){
			if(window[p.first]<p.second){
				return false;
			}	
		}
		return true;
	}
	string minWindow(string s,string t)
	{
		for(const auto &c:t){
			need[c]++;
		}
		int l = 0;r = -1;
		int len = INT_MAX,ansL = -1;
		while(r<int(s.size()))
		{
			if(need.find(s[++r])!=need.end())
			{
				window[s[r]]++;
			}
			if(check()&&l<=r)//窗口是可行的,则收缩左指针
			{
				if(r-l+1<len)
				{
					len = r-l+1;
					ansL = l;
				}
				if(window.find(s[l])!=window.end())
				{
					window[s[l]]--;
				}
				l++;
			}
		}
		return ansL==-1? string():s.substr(l,len);		
	}
};

复杂度分析:
时间复杂度:哈希表的大小和字符集有关,设字符集大小为C,O(C*|s|+|t|)。
空间复杂度:两张哈希表,O©。

你可能感兴趣的:(算法,数据结构)