1.题目
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
2.思路
分成几个子问题:
(1)如何检测字符串a包含字符串b的全部内容?
首先,字符串b中的字母可以重复。其次,a中包含b中的所有字符,无需考虑顺序。所以,可以把b中的每个不重复字符的个数存储到b_map中,把a中对应字符的个数也存起来到a_map。只要a_map中的每个字符的个数都大于等于b_map的字符个数即可。
(2)如何在字符串s中滑动窗口?
A. 将end的指针向后移动,直到从0到end的子字符串符合条件。
B. 将start指针从0开始向后移一位,如果此时的子字符串不符合条件了,那就继续移动end指针,直到符合条件。
为什么要这样做呢?因为如果不把start指针向后移动,end向后移,得到的子字符串只会更大。而移动一位之后长度可能减一。
C.当再次得到符合条件的字符串时,就继续向后移动start指针直到不满足条件,此时得到的一定是最短的字符串了。
3.代码
class Solution {
public:
unordered_map<char,int> t_mp,s_mp;//t_mp是t中每个字符的个数,s_mp是s中的t中每个字符的个数
bool checkContainAll(){
for(const auto &p:t_mp){
//遍历t_mp,查看s_mp中的对应个数是否小于t_mp中的

该博客详细介绍了LeetCode中的76题——最小覆盖子串的问题,提供了解题思路和代码实现。通过建立字符计数哈希表,利用滑动窗口的方法寻找包含目标字符串所有字符的最小子串。同时,文章还补充了for循环和哈希表的使用语法知识。
最低0.47元/天 解锁文章
2857

被折叠的 条评论
为什么被折叠?



