Leetcode每日刷题之30.串联所有单词的子串

news2024/9/21 10:47:24

1.题目解析

本题的题目要求给出一个字符串 s 与一个字符数组 words ,并且 words 中的所有单词长度均相同,我们要寻找出 s 中是否存在子串符合 words 中单词的任意组合而成,注意重要的一点是 words 中的所有单词的长度均相同,这是解决问题的重要一点

2.算法原理

这里我们要把握的一个点就是words中的所有单词均是长度相同的单词,根据我们上一道题438.找到字符串中所有字符异位词 ,与这道题的思路大同小异,不过本题将元素变成了独立的每个单词,这时我们可以使用"滑动窗口",将left与right初始均指向s的开头,然后right一次性移动的长度是words中每个单词的长度,并且进行该操作的次数同样是单词的长度,然后使用哈希表来统计窗口与字符串数组中的单词个数,记录窗口内有效元素的个数,在进窗口后检查有效元素的个数,同样出窗口也要检查,最终判断有效个数是否为字符串数组中的单词个数,如果是就直接返回left对应的下标,反之继续进入循环遍历,最终返回数组即可

 

3.代码展示

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) 
    {
        vector<int> ret;
        unordered_map<string,int> hash1;//保存 words 中的单词数目

        int len = words[0].size();//保存 words 中单词长度
        int m = words.size();//保存 words 中单词个数

        for(auto& s : words)
        { 
            hash1[s]++;
        }
        
        for(int i = 0;i < len;i++)
        {
            unordered_map<string,int> hash2;
            for(int left = i,right = i,count = 0;right + len <= s.size();right += len)
            {
                //进窗口 + 维护 count
                string in = s.substr(right,len);
                hash2[in]++;
                if(hash1.count(in) && hash2[in] <= hash1[in])
                {
                    count++;
                }
                //判断
                if(right - left + 1 > len * m)
                {
                    //出窗口 + 维护 count
                    string out = s.substr(left,len);
                    if(hash1.count(out) && hash2[out] <= hash1[out])
                    {
                        count--;
                    }
                    hash2[out]--;
                    left += len;
                }
                //更新结果
                if(count == m)
                {
                    ret.push_back(left);
                }
            }
        }
        return ret;
    }
};

 

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

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

相关文章

汇总1000+国内外AI工具合集,工作效率提升10倍的秘诀!

工具合集在文章末尾有领取方式。记得点在看收藏&#xff0c;每天默默的学习&#xff0c;然后惊艳所有人。 很多AI&#xff0c;都是开发商在自己的领域&#xff0c;或是借助某个领域的资源进行算法的模型训练。就目前来讲&#xff0c;每款AI都具备它自身的功能特性&#xff0c;没…

C++刷怪笼(2)类和对象的探索-上

1.前言 了解完C的一些入门干货之后&#xff0c;我们来对C的第一个重点就行学习——那就是类和对象&#xff0c;该重点我们分为三篇文章进行学习&#xff0c;请大家跟紧我的脚步&#xff0c;认真学知识哦~ 2.正文——类和对象 2.1类的定义 2.2.1类的定义格式 • class为定义…

认识git和git的基本使用,本地仓库,远程仓库和克隆远程仓库

本地仓库 #安装git https://git-scm.com/download/win #git是什么&#xff1f;有什么用&#xff1f; git相当于一个版本控制系统&#xff0c;版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 作用: 记录&#xff08;项目&#…

带你0到1之QT编程:三、打地基QMap的高效用法

此为QT编程的第三谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; 码…

Spring security的SecurityConfig配置时 userDetailsService报错如何解决?

文章目录 报错信息原因解决方案1. 实现 UserDetailsService 接口修改 IUsersService 接口和实现类 2. 修改 SecurityConfig3. 其他注意事项 报错信息 ‘userDetailsService(T)’ in ‘org.springframework.security.config.annotation.authentication.builders.AuthenticationM…

class 7: vue.js 3 前端工程化

默认情况下&#xff0c;不能直接使用单文件组件来编写组件&#xff0c;因为浏览器不认识SFC(.vue)文件。因此&#xff0c;我们需要使用webpack或者Vite构建一个支持SFC开发的Vue.js 3环境 目录 前端发展史webpackVue CLI脚手架 前端发展史 Web早期&#xff1a;也就是互联网发展…

激光雷达产品介绍

与传统激光雷达线性重复式的扫描方式不同&#xff0c;Livox mid系列激光雷达扫描路径不会重复。且视场中激光照射到的区域面积会随时间增大&#xff0c;这就意味着视场覆盖率随时间推移而显著提高。 内容参考自《解构大疆旗下 Livox Mid 激光雷达非重复扫描技术》作者&#xff…

今天来聊一聊前端框架有哪些呢? 主流Vue和React

使用工具&#xff1a; 联网搜索 前端框架主要包括React.js、Vue.js、Angular等。在现代网络技术的快速发展中&#xff0c;前端框架成为了实现界面美观、交互性强、用户体验佳的网页和应用不可或缺的工具。下面将具体介绍几款目前主流的前端框架&#xff1a; React.js 简介&…

Spring Boot部署服务器主页事项

部署服务器 首先项目内涉及到本地路径的 你得在数据库创建一个路径 替换上服务器的路径 其次就是数据配置 第一点 非常重要 你的MySQL一定要配置允许所有ip连接 不然网站上无法连接你的数据库 根本无法运行 再就是你的MyBatis也要配置好 服务器地址要正确 数据库端口你也…

[SDK]-按钮静态文本与编辑框控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解按钮控件和编辑框的相关知识 控件 概念:Windows Software Development Kit&#xff08;SDK&#xff09;提供的一组可重用的用户界面元素,在应用程序使用的可视化界面&#xff0c;比如:文本框&#xff…

ini文件中的节点如何删除?

1、在某些场合中&#xff0c;会将某些数据记录本地情况&#xff0c;会有“保存/加载”过程。 比如&#xff1a; 第一次Write节点信息&#xff08;2个&#xff09;&#xff0c;如下节点 第二次Write节点信息&#xff08;1个&#xff09;&#xff0c;如下节点。会发现本来想写入…

实战项目:俄罗斯方块(六)

文章目录 &#x1f34a;自我介绍&#x1f34a;图像界面绘制界面绘制界面显示代码运行结果 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也…

检测文件解析漏洞的工具

免责声明此文档仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…

000:VTK的安装(VTK 编译 + 运行第一个例子)

VTK 医学图像处理---VTK安装 简介&#xff1a; 主要包括四个部分&#xff1a; 安装前准备&#xff08;需要下载和安装什么软件以及为什么&#xff09;&#xff1b;VTK编译与安装&#xff08;编译过程中的一些选项到底是否勾选&#xff0c;已经为什么勾选&#xff09;&#xff…

9.2-考试项目前端容器的高可用+java容器的高可用+使用docker-compose部署考试前端容器+使用docker-compose一次性创建多台容器

配置高可用的项目 基于部署考试系统的项目进行高可用 一、前端的高可用 1.先创建三个前端nginx容器&#xff0c;端口不能映射80 # 删除通用的前端容器 [roothaproxy ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS…

数论——拓展欧几里德算法复习

最近也是在备战比赛&#xff0c;所以也是来小小的复习了一下以前学的东西 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 先放拓欧板子&#xff08;不懂怎么推出了就发在评论区或者私聊&#xff09; int exgcd(int a,i…

s3fs的使用

s3fs是一个将s3服务器上的桶映射为本地目录的程序。 项目源码位于&#xff1a; https://github.com/s3fs-fuse/s3fs-fuse 这是一个比较长期的项目了&#xff0c;现在在大数据领域S3协议基本上已经成为最通用的协议。 各大云平台&#xff0c;什么阿里云&#xff0c;某为云&am…

初识Linux · 有关makefile

目录 前言&#xff1a; 1 makefile的简单使用 2 makefile介绍 前言&#xff1a; 我们上文介绍了gcc和g的基本使用&#xff0c;带了许多的子指令&#xff0c;但是有的时候啊&#xff0c;一个一个敲指令确实有点麻烦了&#xff0c;此时&#xff0c;一个工具就能派上用场&…

DDD设计方法-3-仓储,封装持久化数据

前情提要&#xff1a;一共包含 如下六篇文章&#xff08;篇幅精简&#xff0c;快速入门&#xff09; 1、初识DDD 2、聚合、实体、值对象 3、仓储&#xff0c;封装持久化数据 4、端口和适配器 5、领域事件 6、领域服务&#xff0c;实现约定 DDD设计方法-3-仓储&#xff0c;封装…

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&…