算法——滑动窗口(day8)

30.串联所有单词的子串 

30. 串联所有单词的子串 - 力扣(LeetCode) 

必看!!!本题是我们上次写的438.异位词的进阶版,可参考本篇文章:算法——滑动窗口(day7)-CSDN博客来帮助理解。

题目解析:

这里我就默认大家都已经看过我们上一篇题解的思路了~ 

本道题我们可以通过题意:words数组内所有字符串长度相同的特性对问题进行转化~

例如,我们可以把words数组内的其中一个字符串想象成字符a,另一个字符串想象成字符b。然后也对字符串s中进行成队字符串转化(这里是长度为3的字符串转化为1字符)。双方转化完之后我们就可以发现这跟之前的求异位词那道题已经没有什么区别了~

算法解析:

这里我们再来补充一下细节问题:比如right遍历移动的时候应该是跨words数组中的字符串长度进行移动,因为我们把一段子串想象成一个字符,所以哈希表录入的时候都是已子串录入的,那么我们就不能单纯让right一个字符一个字符遍历,而是一段子串一段子串遍历。left也同样如果。不过在遍历完毕后还需要注意,还有绿色线,黄色线这种划分情况,至于黑色线只不过比蓝色线少了一个字符串,所以没必要划分了~

滑动流程图:

其实只要能把问题转化为我们上一题的思路剩下的就简单了,基本思路是一样的,后面再考虑一下两个哈希表的字符串录入,双指针的移动距离,考虑到所有情况的发生就好了。

代码:

 

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {//记录字符串数组words的数据unordered_map<string, int>hash2;for (auto& ch : words){hash2[ch]++;}//字符串数组中每个字符串的长度int m = words[0].size();//字符串数组中数组的个数int n = words.size();//记录结果vector<int> ret;int k = 0;//多层循环做到不遗漏while (k < m){//在每一层新的循环中都有特定记录字符串s的哈希表unordered_map<string, int>hash1;for (int left = k, right = k, count = 0; right + m <= s.size(); right += m){//获取特定长度的字符串录入hash1中string a = s.substr(right, m);//正常情况下,窗口长度短时扩充窗口//先录入所选子串数据hash1[a]++;//判定录入的数据是否为可以抵消hash2中对应的有效字符串if (hash1[a] <= hash2[a]){count++;}//扩充完发现仍过短就跳到下一循环继续扩充//当窗口长度过长时候,开始缩小窗口if (right - left + 1 > m * n){//获取特定长度的字符串string b = s.substr(left, m);//删减对应字符串个数hash1[b]--;//如果删完后发现缺少了抵消hash2中对应子串可能性if (hash1[b] < hash2[b]){//有效字符串减一count--;}left += m;}//当有效字符串个数完全可以抵消时if (count == n){//录入结果ret.push_back(left);}}//开始下一轮的循环k++;}return ret;}
};

 

76.最小覆盖子串

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

题目解析:

这道题依然可以利用两个哈希表进行辅助,不过与其他题不同的是本题只要划分好的s内至少有t对应的字符就行了, 多了也没事。

对暴力进行分析,如果已经找到满足条件的子串那么left在进入下一轮的遍历时right需要复位吗?————不需要假设【left,right】为目标子串的范围,left继续前进只有2种可能

  • 要么缩小窗口后仍满足条件,这时候只需要让right呆在原地,然后记录满足条件的新子串范围【left,right】即可。
  • 要么不符合所需条件,就让right继续前进直到找到所需字符。

所以不管怎么样right都是不用复位的,而这也引出了我们的滑动窗口~

算法解析:

滑动窗口流程图:

之所以找字符种类而不是个数是因为本题只要满足t中所含字符即可,个数超出也无大碍。那我们就以hash2中的个数为基准,假设hash2中a有2个,那么只有hash1中a的个数也达2个跟hash2相等那才能算是一个有效种类。在未达到数量标准之前都不算为有效种类~

基本思路为:

  • 进窗口:进之前先录入数据到hash1中,然后判断两表中该字符个数是否相等(若相等,count++)
  • 判断,这里是以判断count与m是否相等,若相等则说明找到子串,更新结果,然后不断出窗口直到count不等于m为止(在这个过程可以找出更多子串)
  • 出窗口:出之前先判断两表中该字符个数是否相等(若相等,则说明删减后无法匹配,则count--),然后删减数据

代码:

class Solution {
public:string minWindow(string s, string t) {//记录字符串s的数据unordered_map<int, int>hash1;//记录字符串t的数据unordered_map<int, int>hash2;for (auto ch : t){hash2[ch - 'a']++;}int count = 0;int len = INT_MAX;int begin = -1;//计算t中字符的种类int m = hash2.size();for (int left = 0, right = 0; right < s.size(); right++){//扩充窗口//录入数据hash1[s[right] - 'a']++;//录入完如果两表字符数量相等,则说明count可+1if (hash1[s[right] - 'a'] == hash2[s[right] - 'a']){count++;}//在扩充窗口的过程中如果已经找到可匹配的子串while (count == m){//记录所找子串长度以及起始位置if (right - left + 1 < len){len = right - left + 1;begin = left;}//判断在缩小窗口之前两表中字符个数是否相等if (hash1[s[left] - 'a'] == hash2[s[left] - 'a']){//若相等则说明该字符出窗口后无法与hash2对应字符匹配count--;}//移除该字符hash1[s[left] - 'a']--;//缩小窗口left++;}}//未找到目的子串if (begin == -1){return "";}else{return s.substr(begin, len);}}
};

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

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

相关文章

W30-python01-Selenium Web自动化基础--百度搜索案例-chrome浏览器为例

原理图 一、下载webdriver--chrome浏览器 根据本机浏览器的版本号下载对应的webdriver版本 http://chromedriver.storage.googleapis.com/index.html 二、安装selenium库 pip install selenium -i Simple Index 三、第一个Web自动化脚本 selenium实现Web自动化的基本步骤&…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢&#xff1f;4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

1、hadoop环境搭建

1、环境配置 ip(/etc/sysconfig/network-scripts) # 网卡1 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.59.11 GATEWAY192.168.59.1 NETMASK 255.255.255.0 # 网卡2 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOdh…

算法通关:006_3二分查找:查找数组中<=num 最右边的值

文章目录 说明主要代码全部代码运行结果 说明 大于等于最右不考&#xff0c;意义不大。 直接看&#xff08;arr.length-1&#xff09; 位&#xff08;即数组最后一位&#xff09;&#xff0c;如果大于num&#xff0c;那就说明arr[arr.length-1]是大于等于最右的数字数组最后一…

学习C语言第十四天(指针练习)

1.第一题C 2.第二题C 3.第三题 00345 short类型解引用一次访问两个字节 4.第四题 6&#xff0c;12 5.第五题C 6.第六题 下面代码结果是0x11223300 7.第七题 int main() {int a 0;int n 0;scanf("%d %d",&a,&n);int i 0;int k 0;int sum 0;for (i 0;…

【多线程】定时器

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 定时器是什么&#xff1f;2. 定时器的应用场景3. Timer类的使用3.1 Timer类创建定时器3.2 schedule()方法…

工作流 Flowable

工作流包括业务流和审批流等业务流程。 在一个流程系统中&#xff0c;任务间往往存在复杂的依赖关系&#xff0c;为保证pipeline的正确执行&#xff0c;就是要解决各任务间依赖的问题&#xff0c;这样DAG结合拓扑排序是解决存在依赖关系的一类问题的利器。DAG ( Directed Acyc…

池化层pytorch最大池化练习

神经网络构建 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.maxpool1 MaxPool2d(kernel_size3, ceil_modeFalse)def forward(self, input):output self.maxpool1(input)return output Tensorboard 处理 writer SummaryWriter("./l…

【React】详解如何获取 DOM 元素

文章目录 一、基础概念1. 什么是DOM&#xff1f;2. 为什么需要获取DOM&#xff1f; 二、使用 ref 获取DOM元素1. 基本概念2. 类组件中的 ref3. 函数组件中的 ref 三、 ref 的进阶用法1. 动态设置 ref2. ref 与函数组件的结合 四、处理特殊情况1. 多个 ref 的处理2. ref 与条件渲…

基于STM32F103的FreeRTOS系列(四)·FreeRTOS资料获取以及简介

目录 1. FreeRTOS简介 1.1 FreeRTOS介绍 1.2 为何选择FreeRTOS 1.3 FreeRTOS资料获取 1.3.1 官网下载 1.3.2 Github下载 1.3.3 托管网站下载 1.4 FreeRTOS的编程风格 1.4.1 数据类型 1.4.2 变量名 1.4.3 函数名 1.4.4 宏 1. FreeRTOS简介 1.1 Free…

11. Hibernate 持久化对象的各种状态

1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程&#xff0c;你将了解到&#xff1a; 持久化对象的 3 种状态&#xff1b;什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中…

Web前端浅谈ArkTS组件开发

本文由JS老狗原创。 有幸参与本厂APP的鸿蒙化改造&#xff0c;学习了ArkTS以及IDE的相关知识&#xff0c;并有机会在ISSUE上与鸿蒙各路大佬交流&#xff0c;获益颇丰。 本篇文章将从一个Web前端的视角出发&#xff0c;浅谈ArkTS组件开发的基础问题&#xff0c;比如属性传递、插…

hamcrest 断言框架使用示例和优势分析

引言 在软件测试领域&#xff0c;断言是验证代码行为是否符合预期的关键环节。Hamcrest 断言框架&#xff0c;以其独特的匹配器&#xff08;Matcher&#xff09;概念和清晰的失败信息&#xff0c;赢得了广泛的赞誉。尽管 Python 标准库中没有内置的 Hamcrest 库&#xff0c;但…

【Linux】-----工具篇(编译器gcc/g++,调试器gdb)

目录 一、gcc/g 简单认识 程序的翻译过程认识gcc 预处理(宏替换) 编译 汇编 链接 宏观认识 如何理解&#xff08;核心&#xff09; 什么是链接&#xff1f; 链接的分类 二、gdb 基本的认识 基本操作及指令 安装gdb 启动gdb ​编辑 显示源代码(list) 运行程序…

SQL labs-SQL注入(三,sqlmap使用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; 盲注简述&#xff1a;是在没有回显得情况下采用的注入方式&#xff0c;分为布尔盲注和时间盲注。 布尔盲注&#xff1a;布尔仅有两种形式&#xff0c;ture&#…

学习笔记:MySQL数据库操作3

1. 创建数据库和表 创建数据库 mydb11_stu 并使用该数据库。创建 student 表&#xff0c;包含字段&#xff1a;学号&#xff08;主键&#xff0c;唯一&#xff09;&#xff0c;姓名&#xff0c;性别&#xff0c;出生年份&#xff0c;系别&#xff0c;地址。创建 score 表&…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

python—pandas基础(2)

文章目录 列操作修改变量列筛选变量列使用.loc[]&#xff08;基于标签)使用.iloc[]&#xff08;基于整数位置&#xff09;使用.filter()方法 删除变量列添加变量列 变量类型的转换Pandas 支持的数据类型在不同数据类型间转换 建立索引新建数据框时建立索引读入数据时建立索引指…

Vue---vue3+vite项目内使用devtools,快速开发!

背景 我们在前期开发时&#xff0c;一般使用chrome或者edge浏览器&#xff0c;会使用vue-devtools或react-devtools&#xff08;此插件个人未使用&#xff0c;可百度下是否可内嵌入项目&#xff01;&#xff09;来审查vue项目&#xff1b;这个需要安转浏览器插件才可支持&…

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…