给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
——————————————————————————————————————————————————————

示例 1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”

示例 2:
输入:s = “a”, t = “a”
输出:“a”

示例 3:
输入: s = “a”, t = “aa”
输出: “”
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

1 <= s.length, t.length <= 105
s 和 t 由英文字母组成

进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?

这个题目如果想在O(n)时间内解决,最好的方法就是滑动窗口,
滑动窗口的题目一般想到不难,想到方法很简单,但是难点就在写代码时的变量设置和窗口移动的一些小细节上;

这个题目的思路大致就这两步:
1,定义一个哈希表记录 t 中每个字符的个数
2,遍历 s 字符串,针对不同情况对窗口进行缩减,并不断更新最小子串的长度和起始位置;

详细注释放到了代码里,细节实现还是有些困难的,所以一定要注意每一个细节
详细注释代码如下:

class Solution {public:string minWindow(string s, string t) {//need的key值是t的每一个字符,value是每一个字符在t中的个数unordered_map<char, int> need;//将t中每一个字符的个数存入哈希表for (char c : t) need[c]++;/*start:当前子串的起始位置left:窗口的左边界,这里left不能替代start的主要原因就是start始终指向的是最短的子串的起始位置,而left会走到最后一个子串的起始位置length:最短子串的长度needCount:所需字符(t中的字符)的个数 */int start = 0, left = 0, length = INT_MAX, needCount = t.size();//right是窗口右边界,用来遍历sfor (int right = 0; right < s.size(); ++right) {//如果当前的字符是t中的字符之一,则所需字符的个数减一if (need[s[right]] > 0) needCount--;//如果当前字符s[right]是t中字符之一的话,减一后一定大于或者等于0//如果当前字符s[right]不是t中字符之一的话,减一后一定小于0//这一步主要是为了下面的while循环need[s[right]]--;//当所需字符为0时,说明此时子串已经涵盖t中所有字符if (needCount == 0) {//去除第一个t字符之前的无关字符,缩减窗口while (left < right && need[s[left]] < 0) need[s[left++]]++;//更新最小长度,记录最小长度子串的起始位置if (right - left + 1 < length) {length = right - left + 1;start = left;}//跳过当前这个t字符,重新开始找新的子串need[s[left]]++;needCount++;left++;}}return length == INT_MAX ? "" : s.substr(start, length);}
};

无注释代码:

class Solution {public:string minWindow(string s, string t) {unordered_map<char, int> need;for (char c : t) need[c]++;int start = 0, left = 0, length = INT_MAX, needCount = t.size();for (int right = 0; right < s.size(); ++right) {if (need[s[right]] > 0) needCount--;need[s[right]]--;if (needCount == 0) {while (left < right && need[s[left]] < 0) need[s[left++]]++;if (right - left + 1 < length) {length = right - left + 1;start = left;}need[s[left]]++;needCount++;left++;}}return length == INT_MAX ? "" : s.substr(start, length);}
};

76. 最小覆盖子串(滑动窗口)相关推荐

  1. LeetCode 76. 最小覆盖子串 (滑动窗口哈希表)

    LeetCode 76. 最小覆盖子串 思路: 准备一个map1记录字符串t(字符, 字符个数) 准备一个map2记录在s的窗口中所包含的t串字符(字符,字符个数) 左端点收缩条件:窗口内已经覆盖了t ...

  2. [Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]

    [问题描述][第76题][最小覆盖子串][中等] 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串.示例:输入: S = "ADOBECODEBAN ...

  3. 【LeetCode】【HOT】76. 最小覆盖子串(滑动窗口)

    [LeetCode][HOT]76. 最小覆盖子串 文章目录 [LeetCode][HOT]76. 最小覆盖子串 package hot;public class Solution76 {public ...

  4. java最小子串覆盖_LeetCode 76. 最小覆盖子串

    LeetCode 76. 最小覆盖子串 题目 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBAN ...

  5. LeetCode - 76 最小覆盖子串

    目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 76. 最小覆盖子串 - 力扣(LeetCode) 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符 ...

  6. LeetCode高频题76. 最小覆盖子串:欠账还债还款问题,子串考虑i开头的情况所有答案更新一波

    LeetCode高频题76. 最小覆盖子串:欠账还债还款问题,子串考虑i开头的情况所有答案更新一波 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从 ...

  7. Leetcode 76最小覆盖子串77组合78子集

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  8. cstring判断是否包含子串_最长子串-滑动窗口

    接下来我会找出LeetCode中一些比较有代表性的题,带来它的算法和讲解 很多题目,使用一般的暴力算法很多都能解出来,但时间复杂度可能是 O(n3),会比最优解慢很多,尤其是数据量变大时. 在我们实际 ...

  9. 72.编辑距离105.前序中序遍历序列构造二叉树151.翻转字符串里的单词104.二叉树的最大深度76.最小覆盖子串110.平衡二叉树31.下一个排列

    72.编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符. ...

  10. 【LeetCode】76. 最小覆盖子串 (Java代码)

    [LeetCode]76. 最小覆盖子串 (Java代码) 来源:力扣(LeetCode) 题目链接:https://leetcode.cn/problems/minimum-window-subst ...

最新文章

  1. 浅尝key-value数据库(三)——MongoDB的分布式
  2. python语言怎么用-Python语言应用解析,如何入门学Python?
  3. 面向B端市场,Mana VR团队将推出VR交互产品
  4. AXI_01 《AXI总线系列文章》由来
  5. 最新BAT大厂面试者整理的Android面试题目模板,成功入职字节跳动
  6. resin指定java版本_resin的几个常用配置
  7. concurrent包下的Exchanger练习
  8. NHibernate笔记Ⅲ--关于EF和NH的比较
  9. Spring Boot 第一个小程序之又来Hello World了
  10. vue.set的用法
  11. dreamweaver开源_Dreamweaver的7种开源替代品
  12. window server 下搭建sftp服务器,Freesshd安装及配置
  13. 《软技能—代码之外的生存指南》
  14. 【夜神模拟器运行app】uniapp将app运行到夜神模拟器
  15. matlab 矩阵分行标准化,matlab如何将矩阵标准化 命令是什么?
  16. 李宏毅2020机器学习笔记1——CXK
  17. 华为鸿蒙备胎计划,重磅!华为启动“备胎”计划,神秘项目曝光代号
  18. 一段真实在个人经历, 给那些迷失方向的朋友[转帖]
  19. 几个学习Python的网站推荐
  20. commit work php,GitHub - sbzhu/weworkapi_php: official lib of wework api

热门文章

  1. 数据中心巡检实操之UPS及电池
  2. cpu性能测试软件 国际象棋,国际象棋、科学计算,整机性能测试
  3. Paper:《Spatial Transformer Networks》的翻译与解读
  4. Postman:Postman(HTTP的测试工具)使用方法详细攻略
  5. TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测
  6. Dataset之Fashion-MNIST:Fashion-MNIST数据集简介、下载、使用方法之详细攻略
  7. BigData:根据最新2018人工智能行业创新企业Top100名单,绘制AI地区热点图,一目了然,看清哪个是AI最热门城市,以及VC最AI的热门领域
  8. 角点检测——发现图像的特征
  9. 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]
  10. Flux快速入门指南