76. 最小覆盖子串

76. 最小覆盖子串

分析:[1]采用滑动窗口,窗口有左右边界,先通过扩展右边界找出一个包含T中所有字符的子串,然后收缩左边界,直到不能再收缩。记录此时的子串。然后收缩左边界,继续扩展右边界,直到再找到满足要求的子串,和上次的进行比较,保存更小的子串。返回执行,直到右边界到达S串尾,且左边界不能再收缩。
在这里插入图片描述
code:

 class Solution {
 public:
	 string minWindow(string s, string t) {
		 int slen = s.length(), tlen = t.length(),left=0,right=0,cnt=0, min_len = INT_MAX;
		 if (slen < tlen || slen == 0 || tlen == 0)return "";
		 string res = "";
		 unordered_map<char, int>m;
		 for (int i = 0; i < tlen; i++)
		 {
			 if (m.find(t[i]) == m.end())
				 m[t[i]] = 0;
			 m[t[i]]++;
		 }
		 while (right<slen)
		 {
			 if (m.find(s[right]) != m.end())
			 {
				 m[s[right]]--;//只要存在就右减减对称的就左加加
				 if (m[s[right]]>= 0)cnt++;
				 while (cnt == tlen)
				 {
					 //记录子串的信息
					 if (min_len > right - left + 1)
					 {
						 min_len = right - left + 1;
						 res = s.substr(left, min_len);
					 }
					 //收缩
					 if (m.find(s[left]) != m.end())
					 {
						 if (m[s[left]] >= 0)cnt--;
						 m[s[left]]++; //对称的就左加加
					 }
					 left++;
				 }
			 }
			 right++;//扩展
		 }
		 return res;
	 }
 };

用一个126位数组代替哈希速度会快点但是思想是一样的。

[1]https://www.cnblogs.com/wmx24/p/9604685.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值