LeetCode 76. 最小覆盖子串

给定两个字符串 st,长度分别是 mn,返回 s 中的 最短窗口 子串 ,使得该子串包含 t 中的每一个字符(包括重复字符 )。如果没有这样的子串,返回空字符串""

测试用例保证答案唯一。

示例 1:

复制代码
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

示例 2:

复制代码
输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:

复制代码
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成
cpp 复制代码
class Solution {
    bool is_covered(int cnt_s[],int cnt_t[])
    {
        for(int i='a';i<='z';i++)
        {
            if(cnt_s[i]<cnt_t[i])
            return false;
        }
        for(int i='A';i<='Z';i++)
        {
            if(cnt_s[i]<cnt_t[i])
            return false;
        }
        return true;
    }
public:
    string minWindow(string s, string t) {
        int cnt_s[128]{};
        int cnt_t[128]{};
        for(auto c:t)
        {
            cnt_t[c]++;
        }
        int m=s.size();
        int ansLeft=-1,ansRight=m;
        int left=0;
        for(int right=0;right<m;right++)
        {
            cnt_s[s[right]]++;
            while(is_covered(cnt_s,cnt_t))
            {
                if(right-left<ansRight-ansLeft)
                {
                    ansLeft=left;
                    ansRight=right;
                }
                cnt_s[s[left]]--;
                left++;
            }
        }
        return ansLeft<0?"":s.substr(ansLeft,ansRight-ansLeft+1);
    }
};
相关推荐
用户0328472220709 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈3 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造