Leetcode刷题详解——最小覆盖子串

news2024/12/26 23:49:35

1. 题目链接:76. 最小覆盖子串

2. 题目描述:

给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成

3. 解法(滑动窗口+哈希表)

3.1 算法思路:

  1. 创建两个哈希表,其中一个将目标串的信息统计起来,另一个哈希表动态的维护窗口内字符串的信息
  2. 当动态哈希表中包含目标串中所有的字符,并且对应的个数都不小于目标串的哈希表中各字符的个数,那么当前的窗口就是一种可行的方案

3.2 算法流程:

  1. 定义两个辅助数组:hash1hash2hash1用于统计字符串t中每个字符的频次,hash2用于统计窗口内每个字符的频次。

  2. 使用变量kinds统计字符串t中有效字符的种类数。遍历字符串t,若hash1[ch]++ == 0,则表示该字符是新字符,将kinds加1。

  3. 初始化变量minlen为最大整数,表示最小窗口的长度,begin为-1,表示最小窗口的起始位置。

  4. 使用双指针leftright,遍历字符串s。对于每个字符in=s[right],将其在hash2中的频次加1。

  5. 如果hash2[in] == hash1[in],说明窗口内的某个字符in已经达到了所需的频次,将count加1。

  6. 如果count等于kinds,说明窗口内包含了字符串t中的所有有效字符。此时需要更新结果。

  7. 如果当前窗口的长度小于minlen,将minlen更新为当前窗口的长度,begin更新为当前窗口的起始位置。

  8. 将窗口左边界向右移动,即将字符s[left++]移出窗口。如果hash2[out] == hash1[out] - 1,说明窗口内的字符out频次减少后仍然满足要求,将count减1。

  9. 重复步骤4至8,直到right遍历完整个字符串s

  10. 最后判断begin是否仍然为-1,如果是则表示未找到满足要求的最小窗口子串,返回空字符串。否则,返回字符串s中起始位置为begin,长度为minlen的子串作为结果。

请添加图片描述

3.3 C++算法代码:

class Solution {
public:
    string minWindow(string s, string t) {
        int hash1[128]={0};//统计字符串t中每个字符的频次
        int kinds=0;//统计有效字符有多少种
        for(auto ch:t)
            if(hash1[ch]++==0) kinds++;
        int hash2[128]={0};//统计窗口内每个字符的频次
        int minlen=INT_MAX,begin=-1;
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            if(++hash2[in]==hash1[in]) count++;//进窗口+维护count
            while(count==kinds) //判断条件
            {
                 if(right-left+1<minlen)//更新结果
                 {
                     minlen=right-left+1;
                     begin=left;
                 }
                 char out=s[left++];
                 if(hash2[out]--==hash1[out]) count--;
            }
        }
        if(begin==-1) return "";
        else return s.substr(begin,minlen);
    }
};

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

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

相关文章

VSCode 自动格式化

1.打开应用商店&#xff0c;搜索 prettier code formatter &#xff0c;选择第一个&#xff0c;点击安装。 2.安装完成后&#xff0c;点击文件&#xff0c;选择首选项&#xff0c;选择设置。 3.在搜索框内输入 save &#xff0c;勾选在保存时格式化文件。 4.随便打开一个文件&a…

FineReport制作任务日历

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 博主接触FineReport帆软报表有一段时间了&#xff0c;正好前几天做了一个任务日历的需求&#xff0c;把每天完成的任务量直观的展示在日历上&#xff0c;方便管理者更好的监控各业务的完成情况&#xff0c;做完后想着…

蜣螂优化(DBO)求解置换流水车间调度问题(PFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

gin 框架出现runtime error: index out of range [0] with length 0

之前是这样的&#xff1a; category : c.Request.Form["type"][0] 加上这一句就变成了 fmt.Println(c.Request.FormFile("type")) category : c.Request.Form["type"][0]

你所瞧不上的东西正以另外一种方式kill you

简单的例子就是&#xff1a; 360se & 360ee的份额比你想象中的大. 360se浏览器&#xff0c;安全浏览器 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 Safari/537.36 360ee浏览器&#xff0c;极速浏览器 n…

摄像头工程师说 Camera-如何控制摄像头的输出尺寸(分辨率)

计算机视觉 Camera-如何控制摄像头的输出尺寸&#xff08;分辨率&#xff09; 摄像头工程师说 Camera-如何控制摄像头的输出尺寸&#xff08;分辨率&#xff09;windowingCroppingSkip/SubsampleScaleBinning总结 摄像头工程师说 Camera-如何控制摄像头的输出尺寸&#xff08;分…

Google Chrome的新“IP保护”功能将隐藏用户的IP地址

导语&#xff1a;在保护用户隐私方面&#xff0c;Google Chrome正在测试一项名为“IP保护”的新功能。通过使用代理服务器掩盖用户的IP地址&#xff0c;这项功能能够增强用户的隐私保护。在意识到IP地址可能被用于秘密追踪后&#xff0c;Google希望在确保用户隐私的同时&#x…

《 汇编语言的系统学习》一、编程语言、机器语言与汇编语言

目录 《 汇编语言的系统学习》1、编程语言1.1 语言1.2 程序 2 编程语言分类2.1 机器语言2.2 汇编语言2.3 高级程序语言2.3.1 编译型2.3.1 解释型 《 汇编语言的系统学习》 1、编程语言 1.1 语言 定义&#xff1a;一种系统的&#xff0c;人与人之间通过声音、符号等进行交流的…

Qwt-QwtPlot类详解

1.概述 QwtPlot类是Qwt库中最重要的类之一&#xff0c;用于创建和管理绘图窗口。 QwtPlot类具有以下主要功能&#xff1a; 提供一个绘图窗口&#xff0c;可以在其中绘制简单或复杂的二维数据图。支持多种类型的图表&#xff0c;包括曲线图、柱状图、散点图等。能够自定义图表…

第一章: LangChain 生成与加载知识库并根据匹配内容回答问题

LangChain——让文本大模型更加智能化系列文章目录 第一章 langchain生成与加载向量库并根据匹配内容回答问题 文章目录 LangChain——让文本大模型更加智能化系列文章目录前言文章简介一、使用步骤1.引入库2.LLM加载3.数据加载4.数据切分与转换向量5.构建prompt5.查询知识库并…

进程的优先级与LAMP项目部署实战

一、进程的优先级&#xff08;扩展&#xff09; 1、什么是进程的优先级 Linux是一个多用户、多任务的操作系统&#xff0c;系统中通常运行着非常多的进程。哪些进程先运行&#xff0c;哪些进程后运行&#xff0c;就由进程优先级来控制 思考&#xff1a;什么时候需要用到进程…

线性表操作的实现--顺序表

本文参考朱战力老师的数据结构与算法--使用C语言一书 文章目录 前言 一、线性表是什么&#xff1f; 二、具体实现 1.顺序表的定义 2.初始化ListInitiate&#xff08;L&#xff09; 3.求当前元素个数ListLength&#xff08;L&#xff09; 4.插入元素ListInsert&#xff08;L&…

js 导出文字到txt文件

简介&#xff1a; js 导出文字到txt文件 效果展示&#xff1a; 代码示例&#xff1a; /*** 导出文字到txt文件* param filename* param text*/ function exportToTxt(filename, text) {if (filename undefined) {filename "example-";}if (text undefined) {tex…

【IDEA配置】IDEA配置

参考视频&#xff1a;【idea必知必会】优化设置 告别卡顿 1. 显示内存 右击底下空白区域&#xff0c;出现memory indicator内存指示器&#xff0c;点击勾选即可显示。有的是在Settings->Appearance->Window Options里&#xff0c;如图所示&#xff1a; 2. 内存设置 …

傻瓜式调用阿里云的接口进行三要素(姓名、手机号和身份证号)校验

傻瓜式调用阿里云的接口进行三要素&#xff08;姓名、手机号和身份证号&#xff09;校验 一、准备1、购买阿里云的三要素核验套餐包2、申请开通三要素一致性核验3、查看AccessKey 二、调用三要素核验接口1、查看接口文档2、查看阿里云的调用示例3、阿里云完整示例代码4、改造后…

高级深入--day39

(实战项目三)新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类、小类、小类里的子链接&#xff0c;以及子链接页面的新闻内容。 效果演示图&#xff1a; items.py import scrapy import sys reload(sys) sys.setdefaultencoding("utf-8")class SinaItem(scrapy.I…

STM32Cube高效开发教程<基础篇>(七)----基础定时器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 概述 STM…

new Vue() 发生了什么?

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0…

Tomcat 和 HTTP 协议

目 录 HTTP 协议HTTP 是什么理解 HTTP 协议的工作过程抓包结果HTTP请求HTTP响应 HTTP 请求 (Request)认识 URL认识 "方法" (method)认识请求 "报头"&#xff08;header&#xff09;认识请求 "正文" (body) HTTP 响应认识 "状态码" (st…

NFS性能瓶颈分析

前言 atop – run it with -d option or press d to toggle the disk stats view. iostat – try it with the -xm 2 options for extended statistics, in megabytes, and in two-second intervals. iotop – top-like I/O monitor. Try it with the -oPa options to show the…