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©。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值