76. 最小覆盖子串

知识点:字符串;滑动窗口

题目描述

给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

解法一:滑动窗口

这其实也是滑动窗口的一道典型题目
刚看题目,最小子串,其实应该自然的想到滑动窗口。 最小,往往都是right向右移动满足条件,寻找可行解,然后left移动,缩小窗口,寻找最优解;
对应到这道题目:
1.right右移,直到当前窗口满足条件,也就是窗口内含有t里的全部的字符

步骤一的难点在于怎么知道窗口内含有t里的全部了,自然的想到可以用哈希表先来统计t里每个字符的数量,然后向右遍历,遇到一个数量就减1.那这时候又有问题,什么时候停止呢,再去遍历一遍哈希表,每个value都为0就停?
总不能每走一步检查一遍吧。所以可以直接使用一个变量,比如needcout来表示我们需要的总数量,注意**是当前窗口内我们需要字符的总数量**当这个数量为0时,代表t里的字符都包括了。
注意这里还有一个小点就是比如我们需要abc,那我们可能刚开始进来两个a,也就是aa,不要把needcount直接减2了,是减1,这个a是多余的,我们并不需要,所以哈希表的value if为负了,其实就表示有多余的元素了。

2.left开始移动,缩小窗口

步骤二无非就几种可能:
left的元素啥用没有,left继续接着移就行
left的元素是t里的元素,但是对应的value为负值,证明是多余的,移出去也没事;
left的元素是t里的元素,对应的value值为0,证明这个很关键,当移出去的时候,我们的窗口就不满足条件了,右边窗口需要继续移动;重复步骤一
from collections import Counter
class Solution:
def minWindow(self, s: str, t: str) -> str:
count_table = Counter(t)
i, j = 0, len(s)
need_count = len(t) #当前窗口内需要的全部数量
left = 0
for index, cur_str in enumerate(s):
if cur_str in count_table and need_count > 0:
if count_table[cur_str] > 0:
need_count -= 1
count_table[cur_str] -= 1 if need_count == 0: # 开始收缩
while True:
str_temp = s[left] #出窗口的元素
if str_temp in count_table and count_table[str_temp] == 0: #找到一个必须的元素后就不能再往出了
break
elif str_temp in count_table and count_table[str_temp] < 0:
count_table[str_temp] += 1
left += 1
if index-left < j-i:
i, j = left, index #记录此时的窗口
count_table[str_temp] += 1 # 再往外走一个,然后右边开始重新走找满足条件的窗口
need_count += 1
left += 1
return "" if j == len(s) else s[i:j+1]

【LeetCode】76. 最小覆盖子串的更多相关文章

  1. Java实现 LeetCode 76 最小覆盖子串

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

  2. Leetcode 76.最小覆盖子串

    最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...

  3. [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)

    https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...

  4. 【leetcode 76. 最小覆盖子串】解题报告

    思路:滑动窗口思想 方法一:滑动窗口 string minWindow(string s, string t) { // 1.tdict记录T中每个字母与字母个数 // 2.维护一个滑动窗口字母的计数 ...

  5. LeetCode 76. 最小覆盖子串(Minimum Window Substring)

    题目描述 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC ...

  6. leetcode 76最小覆盖子串

    time O(n) spaceO(n) 的方法: 还是借助哈希表,所有字母初始化为0,将t中出现的所有字母次数全都记录在哈希表里: 采用双指针,分别为一个头指针head,和尾指针tail.flag记录 ...

  7. [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)

    题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...

  8. POJ2185Milking Grid(最小覆盖子串 + 二维KMP)

    题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...

  9. KMP算法 - 求最小覆盖子串

    KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...

随机推荐

  1. python学习之matplotlib实战2

    import numpy as np import matplotlib.pyplot as plt def main(): #scatter fig = plt.figure() ax = fig. ...

  2. emu8086实现两位数乘法运算

    题目说明:从键盘上输入任意两个不大于2位数的正实数,计算其乘积,结果在屏幕上显示 一.准备材料 DOS功能调用表:https://blog.csdn.net/mybelief321/article/d ...

  3. Numpy库基础___一

    ndarray一个强大的N维数组对象Array •ndarray的建立(元素默认浮点数) 可以利用list列表建立ndarray import numpy as np list =[0,1,2,3] ...

  4. Java基础——Math类

    Math包含执行基本数字运算的方法 没有构造方法的情况下如何使用类中的成员? 看类的成员是否都是静态的,是的话可以直接通过类名调用 Mathl类的常用方法: 方法名 说明 public static ...

  5. ubuntu20 源码安装nginx以及常用命令

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 ubuntu下安装nginx 个人建议还是不要自己apt-get安装,反正最后加模块还是得用源码编译安装那一套流程 下的慢的该换源换源,该换网换网 ...

  6. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  7. 羽夏看Win系统内核——消息机制篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  8. Java基础 - 异常详解

    异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...

  9. webapi_3 今天真真真全是大经典案例

    这个项目一多起来了,还是分个序号比价好一点,你好我好大家好,然后关于这个标点符号的问题,我打字真的很不喜欢打标点符号,不是不好按,按个逗号其实也是顺便的事情,可能就是养成习惯了,就喜欢按个空格来分开, ...

  10. Water 2.5.6 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...