76. 最小覆盖子串

type
status
date
slug
summary
tags
category
difficulty
icon
password

76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
示例 2:
示例 3:
提示:
  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • s 和 t 由英文字母组成
解题思路:
题解分析:
这道题使用滑动窗口的方法来解决。以下是具体的解题步骤:

1. 初始化

  • 使用 need 哈希表记录目标字符串 t 中每个字符需要的数量
  • 使用 window 哈希表记录当前窗口中每个字符的数量
  • 使用 valid 变量记录当前已经满足条件的字符个数

2. 滑动窗口过程

扩大窗口

  • 右指针 i 不断向右移动,将新的字符加入窗口
  • 每当加入一个字符,更新 window 中对应字符的计数
  • 如果该字符是所需字符且数量未超过需求,则 valid 计数加1

收缩窗口

  • 当某个字符的数量超过所需时,左指针 j 向右移动
  • 移动过程中更新 window 中对应字符的计数

更新结果

  • valid == t.size() 时,说明找到一个可行解
  • 如果当前可行解的长度小于之前找到的最小长度,则更新结果

3. 时间复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串 s 的长度
  • 空间复杂度:O(k),其中 k 为字符集大小,本题中字符集为英文字母,所以 k = 26

4. 关键点

  • 使用哈希表维护窗口中字符的频次
  • 使用 valid 变量避免重复检查是否满足条件
  • 左右指针的移动策略保证了找到最小覆盖子串
 
上一篇
53. 最大子数组和
下一篇
239. 滑动窗口最大值

评论
Loading...