Leetcode-76 最小覆盖子串
LeetCode 76: 最小覆盖子串
本题是Leetcode hot100字符串专题的最后一题,难度为hard。
问题描述
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
示例
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
注意:
- 必须在原数组上操作,不能拷贝额外的数组。
 - 尽量减少操作次数。
 
注意:
- 对于 
t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。 - 如果 
s中存在这样的子串,我们保证它是唯一的答案。 
示例 1:
1  | 输入:s = "ADOBECODEBANC", t = "ABC"  | 
示例 2:
1  | 输入:s = "a", t = "a"  | 
示例 3:
1  | 输入: s = "a", t = "aa"  | 
思路分析
解决这个问题,想到字符串哈希肯定是不难的。但是对于初学算法的人来说,滑动窗口并不算是一个很好接受、容易想起的技巧。但如果遇到像计算子串最小长度这样的问题,那么滑动窗口应该是备选方法中优先级比较高的一种做法:
- 窗口的右边界先动,先达到窗口内的字符串满足题目要求的目的。
 - 窗口的左边界后动,在保证窗口满足题目的情况下收缩,确定最小的窗口长度
 
这种方式并不是最优,但本文只讨论未优化的版本(因为我也没优化到比较好的复杂度)
代码实现
1  | class Solution {  | 
复杂度分析
- 时间复杂度:
O(C⋅∣s∣+∣t∣),其中n是数组长度。我们只需要遍历一次数组。 - 空间复杂度:
O(C)。我们只使用了常数级别的额外空间。 - C是字符集大小,根据字符集大小,时间复杂度呈线性增长
 
结论
这题的难点并不在字符串哈希,而在对滑动窗口的掌握上,如果看完本题的题解对滑动窗口还是云山雾罩的感觉,可以多找几道类似的题来练。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 千万进制のBlog!
 评论

