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 则是需要检测的关键字列表。使用上述算法,我们可以快速找出哪些位置出现了所有关键字的组合,这对日志监控、入侵检测等非常有用。
    • 在实际中,这种方式可以被嵌入到自动化监控系统中,持续对实时日志进行分析,以便及时发现异常模式和潜在威胁。

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

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

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

相关文章

1. 解读DLT698.45-2017通信规约--预连接响应

国家电网有限公司企业标准&#xff0c;面向对象的用电信息数据交换协议DLT698.45-2017 为提高用电信息采集系统的业务适应性、采集效率、安全性和数据溯源性&#xff0c;规范用电信息数据交换协议的通信架构、数据链路层、应用层、接口类与对象标识&#xff0c;制定本标准。 …

Linux系统:(Linux系统概述与安装)

硬件计算机硬件是指计算机系统中所有物理部件的总称。包括计算机主机、显示器、键盘、鼠标、内存、硬盘、处理器、主板等等。这些硬件部件是计算机系统运行的基础 不管是电脑系统(个人电脑、服务器等)、还是移动端操作系统(手机、平板等)。它的功能就是做为用户和硬件之间的桥梁…

前端求职简历-待补充

当然可以&#xff0c;针对大厂的前端岗位&#xff0c;一个吸引人的简历应该突出你的技术能力、项目经验、教育背景以及任何能体现你学习能力和团队协作能力的证明。以下是一个简历大纲示例&#xff0c;你可以根据自己的实际情况进行调整&#xff1a; 个人信息 姓名联系方式&a…

图文深入介绍oracle资源管理(续)

1. 引言&#xff1a; 本文将承接上篇继续深入介绍oracle资源管理。本文重点介绍如何使用oracle资源管理器管理好DB。 2. 资源管理器&#xff1a; 可以使用图形界面 OEM$或命令行调用 DBMS RESOURCE MANAGER 程序包的过程进行数据库资源管理。 调用资源管理器的先决条件&…

瑞数后缀加密怎么处理

前言&#xff1a; 瑞数我们经常补环境通过&#xff0c;但是遇到瑞数后缀不知道怎么处理 就拿瑞数4来讲 解决方法&#xff1a; &#xff08;1&#xff09;传明文加密参数 一般情况&#xff0c;我们传明文加密参数也能访问 &#xff08;2&#xff09;再补环境基础调用open …

基于stm32的4G模块点灯实验

led模块功能封装 #include "led.h" #include "sys.h"//初始化GPIO函数 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin GPIO_PIN_8 | GPIO_PIN_9;gpio_inits…

排序算法 —— 直接插入排序

目录 1.直接插入排序的思想 2.直接插入排序的实现 实现分析 实现代码 3.直接插入排序的分析 时间复杂度分析 空间复杂度分析 稳定性 1.直接插入排序的思想 直接插入排序的思想就是把待排序的元素按其关键码值的大小依次插入到一个已经排好序的有序序列中&#xff0c…

pycharm调试带参数命令行的程序

点击 run configuration 点击加号&#xff0c;选择python name填写程序名字&#xff0c;script填写程序路径&#xff0c;下一行填写传入的参数 点击apply&#xff0c;再点ok&#xff0c;即可debug 参考&#xff1a; pycharm 调试模式下命令行参数的传递_pycharm debug传参 ya…

项目实战:构建 effet.js 人脸识别交互系统的实战之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀构建 effet.js &#x1f4d2;1. 什么是effet.js&#x1f4dc;2. 为什么需要使用effet.js&#x1f4dd;3. effet.js的功能&#x1f4da;4. 使用…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…

NC 单据模板自定义项 设置参照(自定义参照)

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 如图下图&#xff0c;NC 单据模板自定义项 设置参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#xff0c;即bd…

【热门主题】000004 案例 Vue.js组件开发

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

JavaWeb合集11-Maven高级

十一、Maven高级 1、分模块设计与开发 为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用&#xff0c;资源共享。 分模块开发需要先针对模块功能进行设计&#xff0c;再进行编码。不会先将工程开发完毕,然后进行拆分。 实现步骤&…

RabbitMQ下载与配置

安装Erlang Erlang 下载地址如下&#xff1a; https://erlang.org/download/otp_versions_tree.html 安装 RabbitMQ RabbitMQ 下载地址如下&#xff1a; https://www.rabbitmq.com/install-windows.html 查看服务&#xff0c;服务已经正常启动 打开Command Prompt 输入rabb…

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代&#xff0c;高效准确地识别文本和图像中的字符变得至关重要。TH-OCR&#xff08;清华 OCR&#xff09;作为一款优秀的光学字符识别软件&#xff0c;以其卓越的性能和广泛的应用场景&#xff0c;受到了众多用户的青睐。其中&#xff0c;车牌识别功能更是在交…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装&#xff08;适用于Windows等操作系统&#xff09;3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头&#xff0c;检测人脸 一、dlib库的安装 在PyCharm中&…