- 题目描述
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
提示:
1 <= s.length, t.length <= 105
s 和 t 由英文字母组成
进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?
来源:LeetCode
- 示例
- 示例 1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC” - 示例 2:
输入:s = “a”, t = “a”
输出:“a”
- 思路分析
- 直接暴力求解不太现实,如果字符串很长的话,效率会非常低。因为要找的是一个符合条件的子串,可以想到会用滑动窗口法:即找到一个长度最小的窗口,包含目标字符串中的所有字符。滑动窗口法有两种情况:①窗口大小固定;②窗口大小不固定。此处即第二种。
- 在寻找窗口之前,我们先处理一下目标字符串 t t t。因为窗口需要满足目标字符串的长度和对应字符的个数,我们将 t t t以 < C h a r a c t e r − I n t e g e r > <Character-Integer> <Character−Integer>的形式保存在字典里,记录每个字符以及对应个数。保存 l e n t len_t lent,表示字符串 t t t的长度,用来监控窗口中的符合要求的字符总长度是否已经达到了字符串 t t t的长度。
- 在找窗口的过程中,我们记录两个值: s t a r t start start和 e n d end end。 s t a r t start start记录窗口的左边界, e n d end end记录窗口的右边界,窗口的内容即为 [ s t a r t , e n d ) [start, end) [start,end)。从 0 0