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. Ajax概述,封装以及联合模板引擎进行数据交互

    欢迎大家去博客冰山一树Sankey,浏览效果更好.直接右上角搜索该标题即可 博客园主页:博客园主页-冰山一树Sankey CSDN主页:CSDN主页-冰山一树Sankey 更多资料可参考Ajax 介绍 ...

  2. kali下对Docker的详细安装

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 前言 Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建.运行.测试以及部署应用程序.如,我们对一些漏洞进行本地复现时,可以 ...

  3. 使用tc ingress来限速接收方向

    Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行入口流量限速(policing),出口部分主要用于队列调度(queuing scheduling).大 ...

  4. 【freertos】003-任务基础知识

    目录 前言 任务概念 任务状态 任务优先级 空闲任务和空闲任务钩子 空闲任务 空闲任务钩子 创建空闲钩子 创建任务 任务参数相关概念 创建静态内存任务 配置静态内存 实现空闲任务堆栈函数 实现定时器任 ...

  5. Redis数据库的初步认识(二)-C/C++连接redis数据库

    1用C语言连接数据库,首先要安装c语言的数据库 在目录/redis- 4.0.1/deps下面执行sudo make/make install命令 在执行完之后可能执行ldconfig命令来更新连接符 ...

  6. spring-boot 注解解析

    package com.hllq.quan.controller; import com.hllq.quan.mapper.WeiboUserMapper; import com.hllq.quan. ...

  7. 什么是 Spring 引导的执行器?

    Spring Boot 执行程序提供了 restful Web 服务,以访问生产环境中运行应用程序 的当前状态.在执行器的帮助下,您可以检查各种指标并监控您的应用程序.

  8. mybatis源码之我见

    以前一直想看mybatis的源代码,但是一直没找到入口(傻),最近看教程,有些感悟. 和起以前一样,关键代码我会用红色标记. 首先,先贴下我的dao和mapper,代码很简单,和平时写的hello w ...

  9. flash的TotalFrames显示undefined

    通过js来操作flash的时候,获取到总帧数的是属性.TotalFrames,而不是属性TotalFrames().在asp.net中,js放在最后可以在一定程度上避免当前flash没有加载完,导致获 ...

  10. 学习RabbitMQ(四)

      I. 消息中间件特点: 1,异步处理模式 消息发送者可以发送一个消息而无需等待响应,消息发送者将消息发送到一条虚拟的通道或队列上,消息接收者则订阅或监听该通道,一条消息可能最终转发给一个或多个消息 ...