题目难度: 困难
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定两个字符串 s 和 t 。返回 s 中包含 t 的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串,则返回空字符串 “” 。
如果 s 中存在多个符合条件的子字符串,返回任意一个。
注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
O(N)
: 假设 M 是 t 的长度, N 是 s 的长度, 只有 N>=M 时才需要遍历 s 的 N 个字符O(N)
: 最多存储 N 个元素class Solution:
def minWindow(self, s: str, t: str) -> str:
# 滑窗+双计数字典+unmatch变量
if len(s) < len(t):
# s更短, 一定没有满足条件的子串
return ""
# 初始化t计数字典
cntt = collections.Counter(t)
# 初始化s计数字典为空, 因为尚未添加s的字符
cnts = collections.Counter()
# 初始化未匹配数目是t的长度
unmatch = len(t)
l = 0
res = ""
for r, c in enumerate(s):
# 遍历滑动窗口右边界
cnts[c] += 1
if cnts[c] <= cntt[c]:
# 新增一个有效包含字符
unmatch -= 1
if unmatch == 0:
# 当前窗口包含t的全部字符, 开始移动左边界
while unmatch == 0:
pc = s[l]
cnts[pc] -= 1
if cnts[pc] < cntt[pc]:
# 减少一个有效包含字符
unmatch += 1
l += 1
# 此时s[l-1:r+1]就是以r为终点的最短有效子串
if res == "" or len(s[l - 1 : r + 1]) < len(res):
res = s[l - 1 : r + 1]
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~