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!
评论