Python描述 LeetCode 76. 最小覆盖子串
Posted 亓官劼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python描述 LeetCode 76. 最小覆盖子串相关的知识,希望对你有一定的参考价值。
Python描述 LeetCode 76. 最小覆盖子串
大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号、CSDN、GitHub、B站等平台分享一些技术博文,主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、Linux常用运维、NLP等相关技术博文,时光荏苒,未来可期,加油~
如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),里面的文章更全更新更快。如果有需要找博主的话可以在公众号后台留言,我会尽快回复消息.
本文原创为【亓官劼】(qí guān jié ),请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 全部文章请关注微信公众号【亓官劼】。
题目
给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
1 <= s.length, t.length <= 105
s
和t
由英文字母组成
**进阶:**你能设计一个在 o(n)
时间内解决此问题的算法吗?
解题思路
双指针,O(n)
l,r分别表示当前区间的左右
r一直向右走,当第一次找到可以满足的序列时,停下。移动l,直到不满足条件位置,在l移动中更新满足的最短序列的起始位置
Python描述
class Solution:
def minWindow(self, s: str, t: str) -> str:
def is_ok(sd, td):
for key, value in td.items():
if sd.get(key, 0) < value:
return False
return True
n, m = len(s), len(t)
if n < m:
return ""
td =
sd =
for i in range(m):
td[t[i]] = td.get(t[i], 0) + 1
sd[s[i]] = sd.get(s[i], 0) + 1
start = end = 0
if is_ok(sd, td):
start, end = 0, m
l, r = 0, m
while r < n:
sd[s[r]] = sd.get(s[r], 0) + 1
while is_ok(sd, td):
if end == 0 or r - l + 1 < end - start + 1:
start, end = l, r+1
sd[s[l]] -= 1
l += 1
r += 1
return s[start:end]
以上是关于Python描述 LeetCode 76. 最小覆盖子串的主要内容,如果未能解决你的问题,请参考以下文章