leetcode30:串联所有单词的字串

给定一个字符串 s 和一个字符串数组 words words 中所有字符串 长度相同

 s 中的 串联子串 是指一个包含  words 中所有字符串以任意顺序排列连接起来的子串。

  • 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd""cdabef", "cdefab""efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。

返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 "foobarthe" 开始位置是 6。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。
子串 "barthefoo" 开始位置是 9。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。
子串 "thefoobar" 开始位置是 12。它是 words 中以 ["the","foo","bar"] 顺序排列的连接。

提示:

  • 1 <= s.length <= 104
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i] 和 s 由小写英文字母组成

本题要求在字符串 s 中找到所有包含字符串数组 words 中所有单词的串联子串的起始索引,words 中单词的顺序可以任意排列,但必须紧挨着出现在子串中。

步骤1:问题分析

  • s 是一个字符串,words 是一个包含多个字符串的数组,这些字符串的长度相同。
  • 我们需要在字符串 s 中找到所有子串,这些子串由 words 中的单词全部串联而成。
  • 使用滑动窗口方法来高效地找到所有满足条件的子串。

步骤2:算法设计与步骤分解

解题思路
  1. 变量初始化

    • 获取 inputString 的长度 inputLengthwordList 的单词数量 wordCount,每个单词的长度 wordLength,以及所有单词拼接后的总长度 totalWordsLength
    • 如果 inputString 的长度小于 totalWordsLength,则没有可能的结果,直接返回空向量。
  2. 词频统计

    • 使用哈希表 wordFrequencyMap 统计 wordList 中各个单词的出现次数,以便在后续判断子串中的单词是否符合要求。
  3. 滑动窗口遍历

    • 对字符串 inputString 的所有可能的起点进行遍历(从 0wordLength - 1),从不同起点来进行窗口滑动,确保覆盖所有可能的位置。
    • 对每一个可能的起点,使用左右指针 (leftPointerrightPointer) 实现滑动窗口,窗口的长度为 wordLength 的整数倍。
    • 窗口逻辑
      • 使用右指针 rightPointer 遍历字符串,每次获取当前窗口中的单词。
      • 如果当前单词在 wordList 中存在,则更新当前窗口的单词频率 currentWindowFrequencyMap
      • 如果窗口中某个单词的频率超出了 wordFrequencyMap 中的值,则使用左指针 leftPointer 移动窗口,直到频率符合要求。
      • 当窗口内的单词数量等于 wordList 中的单词数量时,记录当前左指针位置为结果索引。
      • 如果遇到一个无效的单词(不在 wordList 中),则清空窗口的频率统计,并将左指针直接移动到下一个位置。
  4. 复杂度分析

    • 时间复杂度
      • 滑动窗口的起点有 wordLength 种可能,每次滑动时右指针从左到右遍历整个字符串,因此时间复杂度为 O(wordLength * (inputLength / wordLength)),即 O(inputLength)
      • 在窗口滑动过程中,每次插入和查找操作的时间复杂度为 O(1),因此整体时间复杂度为 O(inputLength)
    • 空间复杂度
      • 使用了两个哈希表来记录词频信息,空间复杂度为 O(wordCount),其中 wordCountwordList 的大小。

步骤3:c++代码

步骤4:算法优化与效率提升的启发

  1. 滑动窗口的使用

    • 这种滑动窗口加哈希表的方法可以有效减少重复计算,尤其是当窗口向右滑动时,不需要完全重新统计每个单词,只需要更新窗口内的变化。
    • 在大规模数据处理时,滑动窗口是一种非常有效的技术,用于在给定窗口内不断更新计算。
  2. 哈希表的快速查找

    • 利用哈希表存储词频,可以在 O(1) 的时间内查找单词的出现次数,这极大地提高了匹配的效率。
    • 通过词频统计,可以轻松处理包含重复单词的情况。
  3. 优化潜力

    • 如果 words 中有较多重复单词,可能可以进一步优化数据结构,例如使用自定义的计数器类来减少哈希表查找的开销。
    • 如果 words 中单词长度较长,可以考虑使用字符串哈希或其他方法来优化字符串匹配的效率。

步骤5:实际应用场景分析

实际应用示例:日志分析和关键字检测

  • 场景
    • 在日志分析中,我们可能需要检测系统日志中的特定模式,确保某些关键字以某种顺序或组合出现,例如检测网络攻击模式、用户行为分析等。
  • 实现方法
    • 可以将系统日志作为字符串 s,而 words 则是需要检测的关键字列表。使用上述算法,我们可以快速找出哪些位置出现了所有关键字的组合,这对日志监控、入侵检测等非常有用。
    • 在实际中,这种方式可以被嵌入到自动化监控系统中,持续对实时日志进行分析,以便及时发现异常模式和潜在威胁。

通过上述步骤,我们不仅解决了一个算法问题,还展示了如何将这种算法应用到现实生活中,从而优化效率、提升生产力。在类似的应用中,处理大规模字符串匹配和检测,结合滑动窗口、哈希表等高效算法是一个有效的方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NetSarang Xshell v8.0060 Linux终端管理器个人免费版

NetSarang Xshell 官方个人完全免费中文版&#xff0c;Xshell特别版&#xff0c;Xshell 个人完全免费&#xff0c;Xshell 是一款最好用的Linux远程连接工具&#xff0c;免费SSH客户端、主机服务器远程管理客户端 。Xshell&#xff0c;轻松管理远程服务器&#xff0c;会话管理器…

《人工智能:CSDN 平台上的璀璨之星》

一、CSDN 上的 AI 热门话题 GPT-3 作为 CSDN 上的热门话题&#xff0c;其应用极为广泛。GPT-3 是 OpenAI 开发的一种基于 Transformer 架构的大规模预训练语言模型&#xff0c;拥有惊人的 1750 亿个参数。它具有多任务处理能力&#xff0c;能够执行多种自然语言处理任务&#x…

基于KNN算法的指纹定位系统(MATLAB,平面,四个锚点)

文章目录 指纹定位指纹定位技术简介基本原理位置估算公式1. 最近邻居算法&#xff08;KNN&#xff09;2. 加权最近邻居算法&#xff08;W-KNN&#xff09;3. 最小二乘法&#xff08;LS&#xff09; 最终位置 P P P通过求解下面的方程获得&#xff1a;应用场景优缺点优点缺点 总…

Python 工具库每日推荐 【pyspider 】

文章目录 引言网络爬虫的重要性今日推荐:pyspider 网络爬虫框架主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:爬取新闻网站的文章案例分析高级特性使用代理处理 JavaScript 渲染的页面扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 Type…

《深度学习》OpenCV 风格迁移、DNN模块 案例解析及实现

目录 一、风格迁移 1、什么是风格迁移 2、步骤 1&#xff09;训练 2&#xff09;迁移 二、DNN模块 1、什么是DNN模块 2、DNN模块特点 1&#xff09;轻量 2&#xff09;外部依赖性低 3&#xff09;方便 4&#xff09;集成 5&#xff09;通用性 3、流程图 4、图像…

玛泽的故事中英文Big Muzzy台词本电子版PDF

《Big Muzzy》玛泽的故事&#xff0c;中英文都有&#xff0c;是BBC制作的&#xff0c;专为英语初学者设计的外语课程。它是教学动画里最有趣的一部&#xff01;风靡全球&#xff0c;上百个国家引进&#xff0c;深受小朋友的喜爱。《Big Muzzy》用动画的形式&#xff0c;讲述了M…

第九课:Python学习之函数基础

函数基础 目标 函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数&#xff0c;就是把 具有独立功能的代码块 组织为一个小模块&#xff0c;在需要的时候 调用函数的使用包含两个步骤&#xff…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

C++核心编程和桌面应用开发 第十一天(静态转换 动态转换 常量转换 重新解释转换)

目录 1.静态类型转换 1.1语法 1.2用法 2.动态类型转换 2.1语法 2.2用法 3.常量类型转换 3.1语法 3.2用法 4.重新解释转换 4.1语法 1.静态类型转换 1.1语法 static_cast<目标转换类型>(待转换变量) 1.2用法 可用于基本数据类型之间的转换。比如int和char之…

2.线段求交

1.线段求交 给定由平面上 n 条闭线段构成的一个集合 S&#xff0c;报告出 S 中各线段之间的所有交点。 我们所希望得到的算法&#xff0c;其运行时间不仅取决于输入中线段的数目&#xff0c;还取决于&#xff08;实际的&#xff09;交点数目。这样的算法&#xff0c;被称为“输…

网络爬虫-数美滑块验证码

仅供研究学习使用。 今天带来的是数美滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 滑动距离可以参考以前我博客上的方式&#xff0c;或者找一找开源的一些算法&am…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Android:记录一个打包发布版的release包以后闪退的问题

个人感觉其实release闪退的问题挺难排查的&#xff0c;因为release包运行起来as捕获不到相应的应用程序进程&#xff0c;从而不易查看到日志&#xff0c;也是我玩得不溜&#xff0c;大家有不同的方法可以评论区探讨&#xff0c;我也定期回复一些评论一起讨论。以下是我遇到的情…

Scrapy | 使用Scrapy进行数据建模和请求

scrapy数据建模与请求 数据建模1.1 为什么建模1.2 如何建模1.3如何使用模板类1.4 开发流程总结 目标&#xff1a; 1.应用在scrapy项目中进行建模 2.应用构造Request对象&#xff0c;并发送请求 3.应用利用meta参数在不同的解析函数中传递数据 数据建模 | 通常在做项目的过程中…

标准IO练习及思维导图

1、完成标准io的单字符、字符串、格式化、模块化实现两个文件的拷贝&#xff1b; #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct sockaddr_un addr_un_t; int main(int argc, const char *argv[]) {FILE*…

Kafka-设计思想-2

一、消息传递语义 现在我们对生产者和消费者的工作方式有了一些了解&#xff0c;让我们讨论一下Kafka在生产者和消费者之间提供的语义保证。 1、最多发送一次&#xff1a;会造成数据丢失 2、至少发送一次&#xff1a;会造成数据重复消费 3、只发送一次&#xff1a;我们想要的效…

docker 部署 vscode 远程开发环境(Go,Java)

1. 前言&#xff1a; 构建一个远程开发环境&#xff0c;一般来说开个linux云服务器是最好的&#xff0c;但是这里使用 docker 来搭建&#xff0c;docker 意味着更省资源&#xff0c;可以直接在一个 linux 主机上去设置 准备 一个安装了 docker 的主机&#xff0c;最好是linux&…

几何完备的3D分子生成/优化扩散模型 GCDM-SBDD - 评测

GCDM 是一个新的 3D 分子生成扩散模型&#xff0c;与之前的 EDM 相比&#xff0c;GCDM 优化了其中的图神神经网络部分&#xff0c;使用手性敏感的 SE3 等变神经网络 GCPNET 代替了 EDM 中的 EGNN&#xff0c;让节点间消息传递、聚合根据手性不同而进行。本文对 GCDM-SBDD&#…

制造企业数字化转型顶层规划案例(55页满分PPT)

基于集团的战略和运营特点&#xff0c;数字化转型应如何考虑&#xff1f; 在集团的战略和运营特点基础上进行数字化转型&#xff0c;需要实现业务多元化&#xff0c;整合资源和流程&#xff0c;推动国际化拓展&#xff0c;实施差异化战略&#xff0c;并通过数据驱动决策&#…

WPF开发一个语音转文字输入软件(一)

本文探索的Demo地址: https://gitee.com/lishuangquan1987/try_win32 https://github.com/lishuangquan1987/try_win32 后续会把他当做一个开源项目来维护 需求 开发一个软件&#xff0c;能够让用户说话来进行文字输入。具体如下&#xff1a; 像腾讯电脑管家那样的悬浮球悬浮…