leetCode 76. 最小覆盖子串 + 滑动窗口 + 图解(详细)

news2024/11/17 7:48:40

76. 最小覆盖子串 - 力扣(LeetCode)


给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案

示例 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 的子串中,因此没有符合条件的子字符串,返回空字符串

从左->到下->到右->到下看以下图 

 

(1)用一个哈希map

class Solution {
public:
    bool check(unordered_map<char,int> mp) {
        for(auto it:mp){
            if(it.second > 0) return false;
	    }
        return true;
    }
    string minWindow(string s, string t) {
        unordered_map<char,int> need;
        int strStart=0,windowLen=INT_MAX;
        int left=0,right=0;
        for(char c:t) {
            need[c]+=1;
        }
        while(right < s.size()) {
            char curChar = s[right];
            if(need.find(curChar)!=need.end()) need[curChar]--;
            while(check(need)) {
                // 更新窗口的长度和起始位置
                int curWindowLen = right-left+1;
                if(curWindowLen < windowLen) {
                    windowLen = curWindowLen;//更新窗口的长度
                    strStart=left;//更新窗口的起始位置
                }
                //继续缩小窗口
                char leftChar = s[left];
                if(need.find(leftChar)!=need.end()) need[leftChar]++;
                left++;
            }
            right++;
        }
        if(windowLen != INT_MAX) return s.substr(strStart,windowLen);
        return "";
    }
};

(2)实际上还可以把哈希map换成数组,原理其实都是一样的,来看下代码

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int>need(128);
        for(char c:t) {
            need[c]+=1;
        }
        int charCount = t.size();
        int left=0,right=0;
        int strStart=0,windowLen=INT_MAX;
        while(right < s.size()) {
            char curChar = s[right];
            if(need[curChar] > 0) {
                need[curChar]--;
                charCount--;
            }else need[curChar]--;
            while(charCount==0) {
                // 更新窗口的长度和起始位置
                int curWindowLen = right-left+1;
                if(curWindowLen < windowLen) {
                    windowLen = curWindowLen;//更新窗口的长度
                    strStart=left;//更新窗口的起始位置
                }
                //继续缩小窗口
                char leftChar = s[left];
                if(need[leftChar] == 0) {
                    need[leftChar]++;
                    charCount++;
                }else need[leftChar]++;
                left++;
            }
            right++;
        }
        if(windowLen != INT_MAX) return s.substr(strStart,windowLen);
        return "";
    }
};

 我们可以简化一下代码:

if(need[curChar] > 0) {
    need[curChar]--;
    charCount--;
}else need[curChar]--;

可以写成
if(need[curChar]-- > 0) {
    charCount--;
}
if(need[leftChar] == 0) {
    need[leftChar]++;
    charCount++;
}else need[leftChar]++;

可以写成
if(need[leftChar]++ == 0) charCount++;

(2.1)于是,就有如下代码:

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int>need(128);
        for(char c:t) {
            need[c]+=1;
        }
        int charCount = t.size();
        int left=0,right=0;
        int strStart=0,windowLen=INT_MAX;
        while(right < s.size()) {
            char curChar = s[right];
            if(need[curChar]-- > 0) {
                charCount--;
            }
            while(charCount==0) {
                // 更新窗口的长度和起始位置
                int curWindowLen = right-left+1;
                if(curWindowLen < windowLen) {
                    windowLen = curWindowLen;//更新窗口的长度
                    strStart=left;//更新窗口的起始位置
                }
                //继续缩小窗口
                char leftChar = s[left];
                if(need[leftChar]++ == 0) charCount++;
                left++;
            }
            right++;
        }
        if(windowLen != INT_MAX) return s.substr(strStart,windowLen);
        return "";
    }
};

(3) 用两个哈希map

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int> need;
        unordered_map<char,int> window;
        for(auto c:t) {
            need[c]+=1;
        }
        int right=0,left=0;
        int valid=0;
        int start=0,minLen=INT_MAX;
        while(right < s.size()) {
            char cur = s[right];
            // 进行窗口数据一系列更新
            if(need.find(cur)!=need.end()) {
                window[cur]++;
                if(window[cur] == need[cur]) valid++;
            }
            while(need.size() == valid) {
                if(right - left + 1 < minLen) {
                    start = left;
                    minLen = right - left + 1;
                }
                // d 是将移除窗口的字符串
                char deleteChar = s[left];
                // 进行窗口内数据当一系列更新
                if(window.find(deleteChar)!=window.end()) {
                    if(window[deleteChar] == need[deleteChar]) valid--;
                    window[deleteChar]--;
                }
                // 左边移动窗口
                left++;
            }
            right++;
        }
        return minLen == INT_MAX ? "" : s.substr(start,minLen);
    }
};

推荐文章:76. 最小覆盖子串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-window-substring/solutions/736507/shu-ju-jie-gou-he-suan-fa-hua-dong-chuan-p6ip/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AICFD案例操作】潜艇阻力AI预测分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

3D开发工具HOOPS:助力Navisworks数据处理与3D模型可视化!

在过去的25年中&#xff0c;Tech Soft 3D一直以其卓越的3D技术不断帮助全球600多家客户实现创新&#xff0c;这些客户包括HEXAGON、SolidWorks、SIEMENS、Aras、ANSYS、AVEVA等各行业领军企业。 该公司拥有四款原生产品&#xff0c;分别是&#xff1a;HOOPS Exchange、HOOPS C…

程序员就业时要考虑什么?

要考虑的事情可多了&#xff0c;但很多毕业生都没有这个意识&#xff0c;光想着把自己给卖了。 我还记得自己刚毕业那年&#xff0c;光想着工资高&#xff0c;结果进了熬夜“大班”——一家外包公司。有项目的时候真不是996这么简单&#xff0c;每天是9126&#xff0c;赶上中秋…

jsp获取数据 jsp直接获取后端数据 获取input选中的值 单选 没 checked属性

let str0${showList}; let str1${showList}; 然后可以通过JSON.parse() 转 获取input选中的值 //goodsType 按类别 goods按货品var oneType $("input[ namecriteria1 ] ").val();//count按数量 totalprice按费用var twoType $("input[ namecriteria2 ] &q…

如何选择合适的全渠道智慧收银解决方案?亿发推荐智能收银一体化系统

在数字化时代&#xff0c;品牌面临着越来越多的挑战和机遇。为了更好地适应市场的变化&#xff0c;提高竞争力&#xff0c;越来越多的企业选择引入新零售经营解决方案&#xff0c;以实现定制化的用户运营&#xff0c;沉淀私域流量池&#xff0c;提升流量的高效转化,形成一个完善…

elementUI 特定分辨率(如1920*1080)下el-row未超出一行却换行

在1920*1080分辨率下&#xff0c; el-col 内容未超出 el-col 宽度&#xff0c;el-col 不足以占据一行&#xff0c;el-row 却自动换行了&#xff08;其他分辨率没有这个问题&#xff09;。 截图&#xff1a; 排查&#xff1a; el-col 内容没有溢出&#xff1b;没有多余的 pad…

一次不接受官方建议导致的事故

记录一下 一次Elasticsearch集群事故分析、排查、处理 背景介绍 事故发生的ElasticSearch集群共有7台机器&#xff1a; 10.163.204.19310.163.204.19410.163.204.19510.163.220.7310.163.220.7410.163.220.22010.163.220.221 其中193、194、195的机器配置一样&#xff0c;具…

Boris FX Mocha Pro 2023:Mac/win全能影像处理神器

Boris FX Mocha Pro 2023是一款广受欢迎的影像处理软件&#xff0c;它凭借其强大的功能和卓越的性能&#xff0c;成为了影视后期、广告制作、动画设计等领域的必备工具。无论您是专业的影视制作人员&#xff0c;还是初入行的新手&#xff0c;Boris FX Mocha Pro 2023都能为您的…

医院安全(不良)事件管理系统源代码(B/S架构):事件全程监管 质量持续改进

医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要对象&#xff0c;可以自动、及时、实际地反应医院的安全、不良、近失事件的情况&#xff0c;更好地掌握不良事件的…

三、【常用的几种抠图方式二】

文章目录 橡皮擦魔术橡皮擦背景橡皮擦选择被遮住&#xff08;调整边缘&#xff09;主体抠图 橡皮擦 直接擦除图片的像素&#xff0c;或者填充背景色&#xff0c;适用于要求不高的图片。 魔术橡皮擦 擦出颜色相近的内容&#xff0c;适用于主体跟背景颜色相差较大的情况&#x…

conda 实践

1. 环境部署 1.1. 下载 anaconda 安装包 下面这个网址查找自己需要的版本 https://repo.anaconda.com/archive/ 或者手动下载。 wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh 1.2. 执行安装程序 #安装依赖&#xff1a; sudo yum install bzip2…

手把手教你入门Three.js(初识篇)

Three.js入门篇 一、Three.js和webGL的介绍二、开发和学习环境三、 三个基本概念1. 场景Scene2. 相机Camera3. 渲染器Renderer 四、三维坐标系五、材质Material六、光源1. 点光源2. 环境光3. 平行光: 七、常见几何体八、渲染器-设置设备像素比九、渲染器-锯齿属性 一、Three.js…

8年经验之谈 —— Redis的性能测试与优化!

Redis作为一种高性能的Key-Value数据库&#xff0c;一直受到众多开发者和企业的青睐。然而&#xff0c;在高并发、大数据存储的应用场景中&#xff0c;如何测试并优化Redis的性能&#xff0c;成为了问题。本文将从测试与优化两个方面来讲解如何达到最优的Redis性能。 一、性能…

ae如何去除视频水印?分享三个简单的方法!

ae如何去除视频水印&#xff1f; 去除视频水印可以提高视频的质量、改善视频的流畅度&#xff0c;并减少视频文件的大小&#xff0c;方便观看&#xff0c;那么如何去除视频水印呢&#xff1f;下面是三种方法推荐&#xff0c;一起来看看吧&#xff5e; 方法一&#xff1a;使用A…

NUUO摄像头远程命令执行漏洞复现 [附POC]

文章目录 NUUO 摄像头远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 NUUO 摄像头远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff…

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …

Spring MVC 中文文档

1. Spring Web MVC Spring Web MVC是建立在Servlet API上的原始Web框架&#xff0c;从一开始就包含在Spring框架中。正式名称 “Spring Web MVC” 来自其源模块的名称&#xff08; spring-webmvc&#xff09;&#xff0c;但它更常被称为 “Spring MVC”。 与Spring Web MVC并…

target采退、测评养号购物下单操作教程

1.点击右上角的Create account注册账号 2.填写账号信息 3. 进入自己需要购买的商品页面 点击pick it up购买 4. 进入购物车页面选择快递方式和地址后点击 check out按钮 5. 之后会提示绑定XYK&#xff0c;这里我是用虚拟XYK开卡平台进行支付的. 6. 确认订单无误后点击Place you…

ELK学习(一)

Elasticsearch 安装 项目架构图 添加软件包 # 添加 ELK 软件包到自定义 Yum 仓库 [rootecs-proxy s4]# rsync -av elk/ /var/localrepo/elk/ [rootecs-proxy s4]# createrepo --update /var/localrepo 购买云主机 主机IP地址配置es-0001192.168.1.21最低配置2核4Ges-000219…