算法---滑动窗口练习-7(串联所有单词的子串)

串联所有单词的子串

  • 1. 题目解析
  • 2. 讲解算法原理
  • 3. 编写代码

1. 题目解析

题目地址:串联所有单词的子串

在这里插入图片描述

2. 讲解算法原理

在这里插入图片描述
在这里插入图片描述


算法的基本思想是使用滑动窗口来遍历字符串s,并利用两个哈希表(hash1和hash2)来统计窗口中子串的频次。

具体的算法步骤如下:

  1. 创建一个无序哈希表hash2,用于记录给定单词列表中各单词的频次。初始时,哈希表中所有单词的频次都为0。

  2. 遍历给定单词列表words,将列表中的单词映射到hash2中,并增加相应单词的频次。

  3. 创建一个空的结果集ret,用于存储找到的子串的起始位置。

  4. 获取单词列表中的单词长度len,字符串s的长度n,以及单词列表的长度m。

  5. 进入一个外层循环,循环变量i表示窗口的起始位置,范围从0到len-1。这是为了遍历所有可能的起始位置。

    • 在外层循环中,初始化一个空的哈希表hash1,用于统计窗口中子串的频次。

    • 进入一个内层循环,循环变量left表示窗口的左指针,初始时与外层循环变量i相等,循环变量right表示窗口的右指针,初始时也与外层循环变量i相等。循环条件为right+len小于等于字符串s的长度。

      • 在内层循环中,首先将窗口右侧的子串加入窗口,即将hash1中对应子串的频次加1。

      • 检查加入窗口的子串是否是有效子串,即其频次小于等于hash2中对应子串的频次。如果是有效子串,则将计数器count加1。

      • 检查窗口大小是否超过了单词列表的总长度,即right-left+1是否大于len*m。如果超过了窗口大小,则需要移动窗口。

      • 移动窗口的过程包括以下几个步骤:

      • 检查窗口左侧的子串是否是有效子串,即其频次小于等于hash2中对应子串的频次。如果是有效子串,则将计数器count减1。

      • 将窗口左侧的子串从窗口中移除,即将hash1中对应子串的频次减1。

      • 将左指针left向右移动len位。

      • 检查计数器count是否等于单词列表的长度m。如果相等,则表示当前窗口包含了给定单词列表中的所有单词,将左指针left的位置加入结果集ret。

    • 将右指针right向右移动len位,继续内层循环。

  6. 外层循环结束后,返回结果集ret,其中包含了所有包含给定单词列表中所有单词的子串的起始位置。


3. 编写代码

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map<string,int> hash2;for(auto &e :words)hash2[e]++;vector<int> ret;int len=words[0].size(),n=s.size(),m=words.size();for(int i=0;i<len;i++){//维护窗口中有效字符串个数unordered_map<string,int> hash1;for (int left=i,right=i,count=0;right+len<=n;right+=len){//进string in=s.substr(right,len);hash1[in]++;if(hash2.count(in) && hash1[in]<=hash2[in]) count++;//出if(right-left+1>len*m){string out=s.substr(left,len);if(hash2.count(out) && hash1[out]<=hash2[out]) count--;hash1[out]--;left+=len;}if(count==m) ret.push_back(left);}}return ret;}
};

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

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

相关文章

docker容器技术基础入门-1

文章目录 容器(Container)传统虚拟化与容器的区别Linux容器技术Linux NamespacesCGroupsLXCdocker基本概念docker工作方式docker容器编排 容器(Container) 容器是一种基础工具&#xff1b;泛指任何可以用于容纳其他物品的工具&#xff0c;可以部分或完全封闭&#xff0c;被用于…

#QT(定时轮播电子相册)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; &#xff08;1&#xff09;使用QOBJECT的TIMER &#xff08;2&#xff09;EVENT时间 &#xff08;3&#xff09;多定时器定时溢出判断 &#xff08;4&#xff09;QLABEL填充图片 3.记录 4.代码 widget.h #ifndef WIDGET_H…

批量查询快递不再难,前缀单号助你轻松搞定!

在快递业务日益繁忙的当下&#xff0c;批量查询快递单号成为了许多人的迫切需求。如何能够快速、准确地找到所需的快递单号呢&#xff1f;其实&#xff0c;利用前缀单号进行批量查询是一个高效且实用的方法。下面&#xff0c;就让我们一起了解如何利用前缀单号轻松查找快递单号…

Yolo系列算法-理论部分-YOLOv3

0. 写在前面 YOLO系列博客&#xff0c;紧接上一篇Yolo系列算法-理论部分-YOLOv2-CSDN博客 1. YOLOv3-定型之作 2018年&#xff0c;Redmon团队推出YOLOv3的网络模型&#xff0c;将骨干网络&#xff08;backbone&#xff09;由darknet-19替换成darknet-53网络&#xff0c;加入特…

javaScript脚本语言基础

javaScript脚本语言基础 介绍&#xff1a; JavaScript可以用来实现网页操作(图片切换) 脚本语言&#xff1a;不需要编译 sql html css javaScript 由某种解释器直接可以运行的 JavaScript也是面向对象的&#xff0c;但与java是两种不同的语言 script&#xff1a;脚本 jav…

git reset

参考&#xff1a;https://www.cnblogs.com/lfxiao/p/9378763.html 写完代码后&#xff0c;我们一般这样 git add . //添加所有文件 git commit -m "本功能全部完成" 执行完commit后&#xff0c;想撤回commit&#xff0c;怎么办&#xff1f; git reset --soft HE…

如何用shell脚本构建Android模块

在Android源码编译过程中&#xff0c;shell脚本起到了至关重要的作用。它们不仅用于自动化构建过程&#xff0c;还用于执行各种系统级的任务和测试。下面将详细介绍shell脚本在Android源码编译中的用法&#xff0c;并给出多个具体例子。 Shell脚本在Android源码编译中的基本用…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&#xff0c;但…

Zabbix和Sentinel有什么区别

Zabbix和Sentinel在功能、用途和结构上存在明显的区别。 Zabbix是一个企业级的、开源的、分布式监控套件&#xff0c;主要用于监控IT基础设施的可用性和性能。它可以监控网络和服务的状况&#xff0c;并利用灵活的告警机制&#xff0c;允许用户对事件发送基于邮件、短信、微信…

unity学习(60)——选择角色界面--MapHandler2-MapHandler.cs

1.新建一个脚本&#xff0c;里面有static变量loadingPlayerList using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Assets.Scripts.Model {internal class LoadData{public static List<Pl…

线性表章节课后习题答案集锦

目录 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.5 /* 要比较两个单词在字典中的顺序&#xff0c;可以逐个比较它们的字符。首先比较两个单词的第一个字符&#xff0c;如果相同&#xff0c;则继续比较下一个字符&#xff0c;直到找到不同的字符或者某个单词比较完毕…

IO流——打印流

PrintStream/PrintWriter(打印流) 作用&#xff1a;打印流可以更方便、更高效地将数据打印出去&#xff0c;能实现打印啥就出去啥 PrintStream提供地打印数据的方案 构造器说明public PrintStream​(OutputStream/File/String)打印流直接通向字节输出流/文件/文件路径publi…

Go-知识select

Go-知识select 1. select 的特性1.1 chan读写1.2 返回值1.3 default 2. select 经典使用2.1 永久阻塞2.2 快速检错2.3 限时等待 3. 实现原理3.1 数据结构3.2 实现逻辑3.3 原理总结 4. 总结4.1 大概原理4.2 参数4.3 返回值 一个小活动&#xff1a; https://developer.aliyun.com…

springboot基于SpringBoot的学生请假管理系统的设计与实现

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对学生请假管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上…

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M&#xff0c;定时1s&#xff0c;也就是定时频率为1Hz&#xff0c;所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…

力扣经典题:分割平衡字符串

大佬的代码非常简洁 int balancedStringSplit(char * s){short i0,count0,sign0;while(s[i]){signs[i]L?sign1:sign-1;if(sign0) count;}return count; }

Python最常用的库

本文章主要为大家总结&#xff0c;9个Python最常用的包及使用案例 1 NumPy 描述: NumPy 是 Python 的一个扩展库&#xff0c;支持高维数组与矩阵运算&#xff0c;并为数组运算提供了大量的数学函数库。它是科学计算中的基础包之一&#xff0c;用于处理大型多维数组和矩阵的运…

Transformer代码从零解读【Pytorch官方版本】

文章目录 1、Transformer大致有3大应用2、Transformer的整体结构图3、如何处理batch-size句子长度不一致问题4、MultiHeadAttention&#xff08;多头注意力机制&#xff09;5、前馈神经网络6、Encoder中的输入masked7、完整代码补充知识&#xff1a; 1、Transformer大致有3大应…

第十四届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 特殊日期试题 B: 与或异或试题 C : \mathrm{C}: C: 平均试题 D: 棋盘试题 E : \mathrm{E}: E: 互质数的个数试题 F: 阶乘的和试题 G: 小蓝的旅行计划试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现…

ChatGPT编程—实现小工具软件(批量替换文本、批量处理图像文件)

ChatGPT编程—实现小工具软件(批量替换文本、批量处理图像文件) 今天借助[小蜜蜂AI][https://zglg.work]网站的ChatGPT编程实现一个功能&#xff1a;批量处理文件及其内容&#xff0c;例如批量替换文本、批量处理图像文件等。 环境&#xff1a;Pycharm 2021 系统&#xff1a…