leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]

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

题目解析:

此题在这道题的基础上进行理解会更简单

leetcode --- 30. 串联所有单词的子串[C++ 滑动窗口/双指针]-CSDN博客

本题要求在s字符串中找到含有t字符串所有字符的最短子串。

也就是说s字符串中的字符可能有非t字符串中的字符,或者多个t字符串中的字符(即重复)

那么和找异位词不同的是 不能简单地通过有效字符个数来判断找到符合要求的子串。所以我们用有效字符的种类来判断。

算法原理:

滑动窗口+哈希表

哈希表hash1用来统计t字符串中字符的频次,再设置一个kinds变量,当这个字符出现频次大于0时,就表示有一个种类。

创建哈希表hash2统计窗口中的字符出现的频次,创建count变量表示窗口中字符的种类

滑动窗口四步走

1.进窗口

在哈希表中更新right指针指向的元素的频次

check判断 hash2中这个字符的频次是否和hash1中的频次 相等

只有相等的时候才让count++(表示有效字符种类增加)

2.判断(即找到出窗口的前置条件)

如果count 等于 kinds,表示此时有效字符种类相等

3.更新状态

在进入滑动窗口之前先设置好两个变量begin 和 min_len分别用来记录符合要求的字符串的起始位置和长度

min_len与 right-left + 1 比较

如果right-left + 1更短,则 min_len替换成更短的长度;

将left赋值给begin

4.出窗口

check判断hash2中的出窗口字符频次是否等于hash1中的频次,如果相等,则有效字符种类

count--

然后让left向右移动一位

最后返回结果时,如果begin还等于初始值(表示不存在最小覆盖子串)返回空串

反之返回从begin开始,长度为min_len的子字符串

代码编写:

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 min_len = INT_MAX,begin = -1;for(int left = 0,right = 0,count =0; right < s.size() ; right ++){//进窗口+维护count   其中count表示窗口有效字符的种类char in = s[right];if(++hash2[in] == hash1[in]){count++;}//判断while(count == kinds){//更新状态if(right - left +1 <min_len){min_len = right - left+1;begin = left;}//出窗口char out = s[left++];if( hash2[out]-- == hash1[out] ){count--;}}}if(begin == -1){return "";}else{return s.substr(begin,min_len);}}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python给exe添加以管理员运行的属性

需求 有些应用每次启动都需要用管理员权限运行&#xff0c;比如Python注入dll时&#xff0c;编辑器或cmd就需要以管理员权限运行&#xff0c;不然注入就会失败。 这篇文章用编程怎么修改配置实现打开某个软件都是使用管理员运行&#xff0c;就不用每次都右键点击以管理员身份…

STM32与Freertos入门(六)队列

1、队列介绍 队列是FreeRTOS提供的一种重要的通信机制&#xff0c;用于在任务之间传递数据。 FreeRTOS队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;用于在任务之间传递消息或数据项。它允许一个任务将数据项发送到队列&#xff0c;而另一个任务则可…

自己动手写编译器:语法解析的基本原理

在前面系列章节中我们完成了词法解析。词法解析的基本任务就是判断给定字符串是否符合特定规则&#xff0c;如果符合那么就给这个字符串分配一个标签(token)。词法解析完成后接下来的工作就要分配给语法解析&#xff0c;后者的任务就是判断一系列标签的组合是否符合特定规范。 …

爬虫中scrapy模块的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

面试算法56:二叉搜索树中两个节点的值之和

题目 给定一棵二叉搜索树和一个值k&#xff0c;请判断该二叉搜索树中是否存在值之和等于k的两个节点。假设二叉搜索树中节点的值均唯一。例如&#xff0c;在如图8.12所示的二叉搜索树中&#xff0c;存在值之和等于12的两个节点&#xff08;节点5和节点7&#xff09;&#xff0…

乔拓云平台:从小程序到多平台,全面满足需求

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级的应用程序&#xff0c;逐渐成为了企业和个人进行营销和提供服务的重要工具。然而&#xff0c;对于许多非技术用户来说&#xff0c;自行开发小程序往往面临较高的门槛和成本。为了解决这一问题&#xff0c;乔拓云第三…

数据可视化---饼图、环形图、雷达图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

ViewBinding与DataBinding(视图绑定与数据双向绑定)

前言&#xff1a;心中纵是有所盼 严寒没有减 风很冷 我的手已渐蓝 前言 控件查找对于Android开发来说也是一部血泪史&#xff0c;一直为更有效的方案进行了多种方案的研究和探讨。findViewById() 过于繁琐&#xff0c;强制转换不安全&#xff1b;butterkniife 会存在众多臃肿的…

期货高低板(期货价格飘升,市场掀起高低潮流)

什么是期货高低板&#xff1f; 期货是由交易所统一交易的标准化合约&#xff0c;商品的价格是通过供求关系来决定的。高低板则是期货交易中的常见现象&#xff0c;它表示了在交易过程中&#xff0c;价格波动超过了可设定的最高或最低价&#xff0c;于是交易系统便会出现高板或…

【docker 】Compose 使用介绍

Docker Compose Docker Compose文档 Docker Compose GitHub地址 Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配…

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…

bootstap table表格, 获取当前点击的table元素在该行是第几个

背景 有这样一个需求, table表格中是统计数据, 要求点击每个单元格可实现导出统计的底层数据 数据都是可点击导出的, 思路 获取行bootstap 有个index参数, 所哟要获取当前行第几列, 要获取当前点击的table元素在其所在行中的位置&#xff08;即第几个&#xff09;&#xff…