【LeetCode】76. 最小覆盖子串
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. 最小覆盖子串的更多相关文章
- Java实现 LeetCode 76 最小覆盖子串
76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...
- Leetcode 76.最小覆盖子串
最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...
- [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)
https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...
- 【leetcode 76. 最小覆盖子串】解题报告
思路:滑动窗口思想 方法一:滑动窗口 string minWindow(string s, string t) { // 1.tdict记录T中每个字母与字母个数 // 2.维护一个滑动窗口字母的计数 ...
- LeetCode 76. 最小覆盖子串(Minimum Window Substring)
题目描述 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC ...
- leetcode 76最小覆盖子串
time O(n) spaceO(n) 的方法: 还是借助哈希表,所有字母初始化为0,将t中出现的所有字母次数全都记录在哈希表里: 采用双指针,分别为一个头指针head,和尾指针tail.flag记录 ...
- [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)
题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...
- POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...
- KMP算法 - 求最小覆盖子串
KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...
随机推荐
- python学习之numpy实战
import numpy as np def main(): lst=[[1,3,5],[2,4,6]] print('hello world') print(type(lst)) np_lst = ...
- Java基础——ArrayList
Java基础--ArrayList 作用:提供一个可变长度的集合,底层实际上是一个可变长度的数组 格式:ArrayList <E> arr=new ArrayList<>(); ...
- Mycat+MySql 主从复制-读写分离 看这一篇就够了
通过mycat和mysql的主从复制配合搭建数据库的读写分离,可以实现mysql的高可用性,下面我们来搭建mysql的读写分离. 1.一主一从 1.在node01上修改/etc/my.cnf的文件 ...
- 建立META-INF/spring.factories文件的意义何在
平常我们如何将Bean注入到容器当中 @Configuration @EnableConfigurationProperties(HelloProperties.class) public class ...
- idea中将已有项目转变为git项目,并提交到git服务器上
idea中将已有项目转变为git项目,并提交到git服务器上 前言 有时候,本地有个项目不错,想要分享到github或者码云上,我们就会有这样的需求:项目在本地已经存在(可能不是git项目),又想提交 ...
- SpringBoot和SpringCloud的区别?
SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个微服务之间提供 ...
- NOW()和 CURRENT_DATE()有什么区别?
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒. CURRENT_DATE()仅显示当前年份,月份和日期.
- 构造器注入和 setter 依赖注入,那种方式更好?
每种方式都有它的缺点和优点.构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖.如果使用 XML 来描述依赖, Setter 注入的可读写会更强.经验法则是强制 ...
- SqlMapConfig.xml文件详解
SqlMapConfig.xml 是 mybatis 的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHan ...
- solr集群搭建,zookeeper集群管理
1. 第一步 把solrhome中的配置文件上传到zookeeper集群.使用zookeeper的客户端上传. 客户端命令位置:/root/solr-4.10.3/example/scripts/cl ...