【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 ...
随机推荐
- BUU [GKCTF 2021]签到
BUU [GKCTF 2021]签到 1.题目概述 2.解题过程 追踪HTTP流 在下面发现了一串可疑字符 Base16转base64 放到010里看看 复制下来,去转字符 好像不是,再回去找找其他的 ...
- Java安全第一篇 | 反射看这一篇就够了
什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...
- MySQL数据库阶段学习目录
MySQL数据库学习目录 MySQL数据库初识 MySQL的库表详细操作 MySQL行(记录)的详细操作 快捷使用数据库.表.表内容增删改查 MySQL之单表查询 MySQL之多表查询 Navicat ...
- EasyUI 之datagrid 使用 【DataGrid属性解释】
可选的参数 DataGrid 属性 覆写了 $.fn.datagrid.defaults. 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls ...
- BUAA_DS_聊聊链表
幸福穿着节日的盛装欢迎你. --威廉•莎士比亚<罗密欧与朱丽叶> 1. 说在前面 大家在学数组的时候小脑瓜里有没有这样的疑惑:为什么数组必须是定长的?为什么数组开太长会编译错误?数组越界为 ...
- 半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session
1正则表达式 1.1基本的匹配字符串 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo ...
- 【算法】两个list合并
转载博客地址 http://blog.sina.com.cn/s/blog_5da93c8f0101fdrp.html 有两个ArrayList,分别为list1和list2,分析这两个list后生成 ...
- Element-UI资源原型库
Element-UI v2.0.0版本 Axure和Sketch库: 链接:https://pan.baidu.com/s/1LdsEh8BKQBjcWBKV5yQilQ 提取码:1xqn
- springboot+shiro 02 - 异步ajax请求无权限时,返回json格式数据
博客: https://www.cnblogs.com/youxiu326/p/shiro-01.html github:https://github.com/youxiu326/sb_shiro_s ...
- c语言代码规范
什么叫规范?在C语言中不遵守编译器的规定,编译器在编译时就会报错,这个规定叫作规则.但是有一种规定,它是一种人为的.约定成俗的,即使不按照那种规定也不会出错,这种规定就叫作规范.虽然我们不按照规范也不 ...