给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。
 1 //使用滑动窗口
 2 //我们最开始先扫描一遍T,把对应的字符及其出现的次数存到 HashMap 中。
 3 //
 4 //- 然后开始遍历S,就把遍历到的字母对应的 HashMap 中的 value 减一,如果减1后仍大于等于0,cnt 自增1。
 5 //
 6 //- 如果 cnt 等于T串长度时,开始循环,纪录一个字串并更新最小字串值。然后将子窗口的左边界向右移,如果某个移除掉的字母是T串中不可缺少的字母,那么 cnt 自减1,表示此时T串并没有完全匹配。
 7 //
 8 //解法一:
 9
10 class Solution {
11 public:
12     string minWindow(string s, string t) {
13         string res = "";
14         unordered_map<char, int> letterCnt;
15         int left = 0, cnt = 0, minLen = INT_MAX;
16         for (char c : t) ++letterCnt[c];//记录子串中的相同字母个数
17         for (int i = 0; i < s.size(); ++i) {
18             if (--letterCnt[s[i]] >= 0) ++cnt;
19             while (cnt == t.size()) {
20                 if (minLen > i - left + 1) {
21                     minLen = i - left + 1;
22                     res = s.substr(left, minLen);
23                 }
24                 if (++letterCnt[s[left]] > 0) --cnt;//还有重复的字母
25                 ++left;
26             }
27         }
28         return res;
29     }
30 };
31
32
33
34 //这道题也可以不用 HashMap,直接用个 int 的数组来代替,因为 ASCII 只有256个字符,
35 //所以用个大小为256的int数组即可代替 HashMap,但由于一般输入字母串的字符只有128个,
36 //所以也可以只用128,其余部分的思路完全相同,虽然只改了一个数据结构,但是运行速度提高了一倍,
37 //说明数组还是比 HashMap 快啊,代码如下:
38
39
40 class Solution {
41 public:
42     string minWindow(string s, string t) {
43         string res = "";
44         vector<int> letterCnt(128, 0);
45         int left = 0, cnt = 0, minLen = INT_MAX;
46         for (char c : t) ++letterCnt[c];
47         for (int i = 0; i < s.size(); ++i) {
48             if (--letterCnt[s[i]] >= 0) ++cnt;
49             while (cnt == t.size()) {
50                 if (minLen > i - left + 1) {
51                     minLen = i - left + 1;
52                     res = s.substr(left, minLen);
53                 }
54                 if (++letterCnt[s[left]] > 0) --cnt;
55                 ++left;
56             }
57         }
58         return res;
59     }
60 };

转载于:https://www.cnblogs.com/zzw1024/p/10711855.html

力扣算法题—076最小覆盖子串相关推荐

  1. 程序员面试需要刷力扣算法题吗

    这里写目录标题 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一些特征 1.2. 为什么要考查算法 1.3. 目前面试主要考查 3 类 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一 ...

  2. LeetCode -- 力扣算法题解题心得 -- (个人笔记记录)持续更新~~

    一.前言 正式开启数据结构+算法研究的历程,准备好一年后的面试.下面的解法不一定是最优解,只求能力提升,会定期更新~~ 二.目录 1 2 19 20 21 24 35 42 83 86 94 96 1 ...

  3. 力扣算法题—042接雨水

    1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class ...

  4. “宝石与石头”:一道简单却巧妙的力扣算法题

    本篇博客会讲解力扣"771. 宝石与石头"的解题思路,这是题目链接. 先来审题: 以下是输出示例: 以下是提示: 本题可以使用数组模拟哈希表来实现.先把宝石字符串中的字符标识到数组 ...

  5. 力扣算法题-19.秋叶收藏集 C语言实现

    题目 小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片 ...

  6. 力扣算法题,第N个神奇数字(Python)

    878.第N个神奇数字 题目描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + ...

  7. 力扣算法题—075颜色分类

    给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...

  8. 力扣算法题(11)动态规划

    70-Climbing Stairs (fibonacci数的矩阵计算) //假设你正在爬楼梯,有n阶,每次可以爬1或2阶,有多少种方法可以爬到楼顶. class solution70{int res ...

  9. 力扣算法题—073矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [[1,0, ...

最新文章

  1. python 异常处理 实例_Python 异常处理(示例代码)
  2. 使用crontab自动化调度jupyter notebook定时运行
  3. python语言入门w-python基础知识(一)
  4. ACL 2019 开源论文 | 使用跨领域语言建模的跨领域命名实体识别
  5. php 8 jit,深入理解PHP8 JIT
  6. 使用纯css做的按钮
  7. JDK中DNS缓存的分析
  8. [css] span与span之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
  9. Apache安装问题:configure: error: APR not found . Please read the documentation
  10. Vue封装hbuilder热更新
  11. 计算机任务栏的操作,win7系统任务栏添加计算机快捷方式的操作方法
  12. 开源程序安装框架-BitNami
  13. EasyUI Datagrid换页不清出勾选方法
  14. JS Grid插件使用
  15. [python] ylgy攻略 用魔法打败魔法
  16. (一)阿里云创建自己的产品和设备
  17. Win10喇叭图标出现红叉提示未安装任何音频输出设备
  18. [转载野猪的一篇文章] 设计模式--简单工厂模式在unity3d里面的使用
  19. c语言之数据类型长度
  20. SCOI2014 方伯伯的玉米田 题解

热门文章

  1. Go:创建新进程(os.StartProcess源码解读)
  2. 用sqoop将mysql的数据导入到hive表
  3. linux command read the content,Linux while 和 read 的用法
  4. mysql5.5 5.7区别_mysql 5.5 和5.7 安装的区别
  5. 第1章 Ext JS介绍与快速入门[1/4]
  6. mybatis plus 日志打印_Mybatis-plus常用API全套教程,看完没有不懂的
  7. 自己动手写Docker系列 -- 6.3 手动配置容器网络(下)
  8. java保护访问,Java中的受保护的访问修饰符
  9. 数据库oracle修改属性列,Oracle修改表结构
  10. MATLAB图像处理之二值化以及灰度处理