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

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

题目解析:

本题在这道题的算法原理基础上进行思考会简单许多

leetcode --- 438. 找到字符串中所有字母异位词[C++/滑动窗口+哈希表]-CSDN博客

关键信息---words中的字符串长度都相等

要在s字符串中找到串联子串。将每一个words中的字符串看做一个字符

比如示例1中,foo看作a,bar看作b

那么s字符串就可以看成是 bacabd (the看作c,man看作d)

那么这道题就变成了和438一样的寻找异位词的问题。

但是这道题还有些不同的地方

比如barfoothefoobarman这个s字符串

除了从b开始的分割方式,还可能存在从第二个字符开始的分割方式,和第三个字符开始的分割方式,这几个分割方式中都可能出现符合题目要求的串联子串,只是示例1恰好没有。但是我们编写代码时要考虑到这个情况。

算法原理:

与438这道题不同的是:

1.这道题的哈希表要存的是字符串出现的频次;

2.此外,指针的移动方式也不同,每次移动的长度应该等于words中的字符串的长度;

3.还有一个不同就是题目解析中说的不同分割方式,这中不同在算法中的体现就是滑动窗口的执行次数。根据题目解析中的规律,当起始的字符跳过了一个words字符串的长度,那么就会和第一种情况(从第一个字符开始的分割方式)重复,所以滑动窗口的执行次数就是words字符串长度的大小。

先创建第一个哈希表hash1来保存words中字符出现的频次

再创建一个哈希表hash2用来保存窗口中字符出现的频次

滑动窗口四步走

1.进窗口 + 维护count

更新哈希表hash2,判断进窗口的字符串是否为有效字符串

有效则count++

2.判断

窗口长度大于words字符串总长度时出窗口

3.出窗口

判断出窗口的字符串是否为有效字符串

有效则count--

然后更新哈希表hash2,把出窗口的字符频次减掉

然后left指针右移

4.更新状态

当有效字符串个数等于words中的字符串个数

将left下标给返回值

以上步骤总共执行len次,len为words中一个字符串的长度

每一次执行的时候,left和right的起始位置要有相应变化

代码编写:

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map<string,int>hash1; //保存words里所有单词出现的频次for(auto &s : words){hash1[s]++;}vector<int>ret;int len = words[0].size(),m = words.size();for(int i = 0;i<len;i++)//滑动窗口执行len次{unordered_map<string,int>hash2;//保存窗口内所有单词出现的频次//right是其中一个字符串的起始位置,其长度要合法且符合要求//所以循环的结束条件为right+len <= s.size()//count为有效字符串个数//注意left和right的起始位置要随滑动窗口执行次数变化而变化for(int left = i,right = i,count = 0;right + len <= s.size(); right+=len){//进窗口 + 维护countstring in = s.substr(right,len);if(++hash2[in] <= hash1[in]){count++;}//判断if(right - left + 1 > len*m){string out = s.substr(left,len);//出窗口    if(hash2[out]-- <= hash1[out]){count--;}left+=len;//出完窗口left要移动}//更新状态if(count == m) //有效字符串个数等于words中字符串个数{ret.push_back(left);}}}return ret;}
};

在时间上进一步优化

因为s字符串中可能出现words字符串中没有的字符,所以在进行比较的时候,hash1会先创建出一个空间再进行比较,这样就造成一定程度的时间消耗,所以在进行比较之前加个判断,hash1.count(in)判断这个字符串是否存在,如果不存在于words中,那就没有判断的必要,不影响有效字符串个数的大小。

优化地方在下方注释标出

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map<string,int>hash1; //保存words里所有单词出现的频次for(auto &s : words){hash1[s]++;}vector<int>ret;int len = words[0].size(),m = words.size();for(int i = 0;i<len;i++)//滑动窗口执行len次{unordered_map<string,int>hash2;//保存窗口内所有单词出现的频次//right是其中一个字符串的起始位置,其长度要合法且符合要求//所以循环的结束条件为right+len <= s.size()//count为有效字符串个数//注意left和right的起始位置要随滑动窗口执行次数变化而变化for(int left = i,right = i,count = 0;right + len <= s.size(); right+=len){//进窗口 + 维护countstring in = s.substr(right,len);if(hash1.count(in) && ++hash2[in] <= hash1[in]) //优化{count++;}//判断if(right - left + 1 > len*m){string out = s.substr(left,len);//出窗口    if(hash1.count(out) && hash2[out]-- <= hash1[out])  //优化{count--;}left+=len;//出完窗口left要移动}//更新状态if(count == m) //有效字符串个数等于words中字符串个数{ret.push_back(left);}}}return ret;}
};

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

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

相关文章

二叉树【数据结构】

目录 二叉树1. 二叉树定义二叉树的存储定义 2. 遍历二叉树(1) 前序遍历(2) 中序遍历(3) 后序遍历(4) 层序遍历 3. 二叉树的相关操作(1) 二叉树的初始化(2) 二叉树的结点的手动创建(3) 二叉树结点的个数(4) 二叉树叶子结点的个数(5) 二叉树的高度(6) 第k层结点个数(7) 通过前序遍…

科技巨头三巨头:百度、阿里巴巴、腾讯的崛起与角力

导言 百度、阿里巴巴、腾讯被誉为中国科技领域的“三巨头”&#xff0c;在搜索、电商、社交等多个领域取得了巨大成功。本文将深入探讨这三家公司的崛起原因、核心业务、战略布局以及彼此之间的竞争和合作关系。 1. 百度的搜索帝国 搜索引擎&#xff1a; 百度以其搜索…

Java 序列化机制详解

Java 序列化机制是一种将对象转换为字节流的过程&#xff0c;以便在网络上传输或保存到文件中&#xff0c;并能在需要时将字节流还原为对象。这一机制通过实现 java.io.Serializable 接口来实现&#xff0c;同时涉及到一些关键概念和注意事项。 Serializable 接口 Serializabl…

开发知识点-09Rust

Rust Rust 语言通常用于编写系统级软件、网络服务器和高性能应用程序&#xff0c;它具有以下特点&#xff1a;1. 高性能和内存安全&#xff1a;Rust 在保证高性能的同时&#xff0c;利用其所有权模型和借用检查器等特性确保内存安全&#xff0c;避免了 C/C 等语言的内存错误和崩…

瑞友天翼应用虚拟化系统 多处SQL 注入漏洞复现(可RCE)

0x01 产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接…

Pytorch nn.Linear()的基本用法与原理详解及全连接层简介

主要引用参考&#xff1a; https://blog.csdn.net/zhaohongfei_358/article/details/122797190 https://blog.csdn.net/weixin_43135178/article/details/118735850 nn.Linear的基本定义 nn.Linear定义一个神经网络的线性层&#xff0c;方法签名如下&#xff1a; torch.nn.Li…

生日蜡烛C语言

分析&#xff1a;假设这个人只能活到100岁&#xff0c;如果不这样规定的话&#xff0c;那么这个人就可以假设活到老236岁&#xff0c;直接一次吹236个蜡烛&#xff0c;我们就枚举出所以情况&#xff0c;从一岁开始。 #include <stdio.h> int f(int a,int b){//计算从a到…

视频素材网站全新上线,海量高清视频等你来探索~

亲爱的视频制作爱好者们&#xff0c;好消息来啦&#xff01;我们的视频素材网站全新上线啦&#xff01;这次我们为大家带来了海量的高清视频素材&#xff0c;无论是风景、城市、人物、动物还是各种特效、背景等&#xff0c;应有尽有&#xff0c;满足您在视频制作过程中的各种需…

【神器】wakatime代码时间追踪工具

文章目录 wakatime简介支持的IDE安装步骤API文档插件费用写在最后 wakatime简介 wakatime就是一个IDE插件&#xff0c;一个代码时间追踪工具。可自动获取码编码时长和度量指标&#xff0c;以产生很多的coding图形报表。这些指标图形可以为开发者统计coding信息&#xff0c;比如…

【MySQL】:复合查询

复合查询 一.多表查询二.自连接三.子查询1.单行子查询2.多行子查询3.多列子查询4.在from语句里使用子查询5.合并查询 准备三张表 emp表 dept表 salgrade表 一.多表查询 实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。我们用一个简单的公司管理系统&#xff0c…

HPM6750系列--第十一篇 Uart讲解(轮询模式)

一、目的 在介绍完GPIO的相关内容下一个必须介绍的就是uart了&#xff0c;因为串口一个主要用途就是用于调试信息打印。 HPM6750在uart的配置上也是相当炸裂&#xff0c;有17个串口&#xff1b;结合HPM6750的高主频高内存&#xff0c;完全可以作为一个串口服务器。 ​​​​​​…

智能优化算法应用:基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天牛须算法4.实验参数设定5.算法结果6.参考文…

MLOps在极狐GitLab 的现状和前瞻

什么是 MLOps 首先我们可以这么定义机器学习&#xff08;Machine Learning&#xff09;&#xff1a;通过一组工具和算法&#xff0c;从给定数据集中提取信息以进行具有一定程度不确定性的预测&#xff0c;借助于这些预测增强用户体验或推动内部决策。 同一般的软件研发流程比…

【lesson17】MySQL表的基本操作--表去重、聚合函数和group by

文章目录 MySQL表的基本操作介绍插入结果查询&#xff08;表去重&#xff09;建表插入数据操作 聚合函数建表插入数据操作 group by&#xff08;分组&#xff09;建表插入数据操作 MySQL表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#x…

【TB作品】STM32 PWM之实现呼吸灯,STM32F103RCT6,晨启

文章目录 完整工程参考资料实验过程 实验任务&#xff1a; 1&#xff1a;实现PWM呼吸灯&#xff0c;定时器产生PWM&#xff0c;控制实验板上的LED灯亮灭&#xff1b; 2&#xff1a;通过任意两个按键切换PWM呼吸灯输出到两个不同的LED灯&#xff0c;实现亮灭效果&#xff1b; 3&…

Axure的案例演示

增删改查&#xff1a; 在中继器里面展示照片

创建型模式之抽象工厂模式

一、概述 1、抽象工厂模式&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 2、抽象工厂模式&#xff1a;一个工厂可以生产一系列产品&#xff08;一族产品&#xff09;&#xff0c;极大减少了工厂类的数量 3、抽象工厂模式&am…

众和策略:加强经济监测预测预警 加大宏观调控力度

12月17日至18日&#xff0c;全国展开和革新作业会议在京举行&#xff0c;整理总结2023年展开革新作业&#xff0c;组织布置2024年展开革新关键使命。会议指出&#xff0c;中心经济作业会议对本年经济作业作了全面体系总结&#xff0c;侧重我国经济全体上升向好&#xff0c;全年…

选择合适教育管理软件:必须考虑的10个关键问题

随着教育行业的迅速数字化&#xff0c;学校要能够提供最新的管理和教育方法。大家逐渐意识到技术让运营变得更容易、更有效率。 不过首先我们需要找到一个能满足需求的应用程序。面对众多的选择&#xff0c;你该如何选择一个合适的平台呢&#xff1f;当然&#xff0c;没有人想…

MYSQL中使用IN,在xml文件中怎么写?

MYSQL&#xff1a; Spring中&#xff1a; mysql中IN后边的集合&#xff0c;在后端中使用集合代替&#xff0c;其他的没有什么注意的&#xff0c;还需要了解foreach 语法即可。