力扣 76. 最小覆盖子串

最小覆盖子串

https://leetcode.cn/problems/minimum-window-substring/description/

问题描述

给定字符串 st,在 s 中找出包含 t 所有字符(包括重复个数)的最短连续子串,返回该子串。若不存在,返回空字符串。


解题思路

使用滑动窗口(双指针)算法,时间复杂度 O(m + n),空间复杂度 O(字符集大小)。

  1. 统计需求 :用哈希表 need 记录 t 中每个字符需要的个数,并用 required 记录不同字符的种类数。
  2. 滑动窗口 :维护左右指针 lr,初始时都指向 0。
  3. 扩展右指针 :每次移动 r 扩大窗口,将当前字符加入窗口计数 window。若该字符在 need 中且 window[c] == need[c],则说明该字符的需求已满足,ans 加 1。
  4. 收缩左指针 :当 ans == required 时,说明当前窗口已覆盖 t,尝试移动 l 缩小窗口,同时更新最小长度和起始位置。若移动后窗口不再满足,则 ans 减 1。
  5. 重复 :直到 r 遍历完整个 s
  6. 结果:根据记录的最小起始位置和长度返回子串。

代码实现(C++)

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size()<t.size()) return "";
        unordered_map<char,int> need,window;
        for(char c:t) need[c]++;
        int required =need.size();
        int l = 0,r =0;
        int ans=0;
        int i=0,len=INT_MAX;
        while(r<s.size()){
            char c=s[r];
            r++;
            if(need.count(c)){//当前字符在t中
                window[c]++;
                if(window[c]==need[c]) ans++;
            }
            while(ans==required){//当前已满足子串包含t中的每一个字符
                if(r-l<len){//如果当前子串更优
                    i=l;
                    len=r-l;
                }
                char d=s[l];
                l++;
                if(need.count(d)){
                    if(window[d]==need[d]) ans--;
                    window[d]--;
                }
            }
        }
        return len == INT_MAX ? "" : s.substr(i, len);
    }
};

复杂度分析

  • 时间复杂度:O(m + n),其中 m 和 n 分别为 s 和 t 的长度。每个字符最多被左右指针各访问一次。
  • 空间复杂度:O(字符集大小),由于字符为英文字母,最多 52 个,可视为常数。若使用哈希表,则与字符种类数相关。

关键点

  • 使用 need 记录需求,window 记录当前窗口的字符计数。
  • ans 记录已满足需求的字符种类数,避免每次遍历整个 need
  • 收缩窗口时,只有当 window[d] == need[d] 时才减少 ans,保证逻辑正确。
相关推荐
一只齐刘海的猫2 小时前
【Leetcode】找到字符串中所有字母异位词
算法·leetcode·职场和发展
海清河晏1113 小时前
数据结构 | 八大排序
数据结构·算法·排序算法
Frank学习路上3 小时前
【C++】面试:关键字与语法特性
c++·面试
IronMurphy4 小时前
【算法五十七】146. LRU 缓存
算法·缓存
Irissgwe4 小时前
数据结构-栈和队列
数据结构·c++·c·栈和队列
凌波粒4 小时前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
liulilittle4 小时前
KCC:在 BBR 思路上的一次探索
网络·tcp/ip·算法·bbr·通信·拥塞控制·kcc
浦信仿真大讲堂4 小时前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件
点云侠5 小时前
PCL 生成三棱锥点云
c++·算法·最小二乘法
兰令水5 小时前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode