【LeetCode】76. 最小覆盖子串

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

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中的
       
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值