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.rhkb.cn/news/452447.html

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

相关文章

thinkpad E14 GEN5 加内存

1、正面 2、背面 3、角落 松掉所有螺丝后&#xff0c;用塑料撬片沿着角落开始撬。把所有的卡口都撬开就可以了。 4、内存盖子 取下背板&#xff0c;就看到内存区域了。上面覆盖了一个散热金属盖子。 拿掉金属盖子。 5、内存卡口 我的这代笔记本是板载16G DDR4 3200内存&…

Java 类和对象详解(下)

个人主页&#xff1a;鲤鱼王打挺-CSDN博客 目录 &#x1f497;前言&#xff1a; &#x1f4af;一.static关键字 1. 为什么要使用static 2. static 修饰成员变量&#xff1a; 3. static 修饰成员方法&#xff1a; ​编辑 4. 静态代码块 5.静态导入包 &#x1f4af;二.…

C++进阶——set和map

目录 前言 一、set 1.set的基本介绍 2.set的使用 2.1构造与迭代器 2.2插入 2.3删除 2.4查找 2.5获取需要的区间 2.6一些使用示例 3.set和multiset的区别 4.set相关oj题目 二、map 1.map的基本介绍 2.map的使用 2.1构造与迭代器 2.2增删查以及获取区间 2.3数据…

【C语言】strtok、strerror函数

1、strtok函数使用 注意&#xff1a;使用strtok时包含头文件&#xff1a;string.h strtok函数原型&#xff1a; char* strtok(char* str, const char* sep); &#xff08;1&#xff09;sep参数指向一个字符串&#xff0c;定义了用作分隔符的字符集合。 &#x…

xlsx xlsx-style-vite 实现前端根据element 表格导出excel且定制化样式 背景 列宽等

前言 先看下最终效果图吧&#xff0c;需要的可以参考我的实现方式 这是最终导出的表格文件 类似这种的&#xff0c;特定单元格需要额外标注&#xff0c;表头也有月份然后细分的&#xff0c;表格组件是这样的 注意 别使用xlsx-style 这个库&#xff0c;太多问题了&#xff0c;…

优阅达携手 Theobald 亮相新加坡科技周,助力企业 SAP 数据集成与应用

针对不同用户需求量身定制解决方案&#xff0c;帮助企业轻松应对从数据提取到分析、从开发到流程管理的 SAP 数据挑战。 上周&#xff0c;2024 新加坡科技周在滨海湾金沙会议展览中心圆满落幕。在为期两天的活动中&#xff0c;七大专题展览同时进行&#xff0c;超过 2,000 家…

【Router】路由器中NAT、NAPT、NPT是什么?

参考链接 NAT vs. NAPT: What’s the Difference? IPv6 Network Prefix Translation (NPt) | pfSense Documentation (netgate.com) 趣谈NAT/NAPT的原理&#xff0c;这篇不可不读&#xff01; - 知乎 (zhihu.com) NAT (Network Address Translation) NAT说明 NAT&#x…

Java | Leetcode Java题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; class Solution {public boolean PredictTheWinner(int[] nums) {int length nums.length;int[] dp new int[length];for (int i 0; i < length; i) {dp[i] nums[i];}for (int i length - 2; i > 0; i--) {for (int j i 1; j …

SQL Server 2019数据库“正常,已自动关闭”

现象&#xff1a; SQL Server 2019中&#xff0c;某个数据库在SQL Server Management Studio&#xff08;SSMS&#xff09;中的状态显示为“正常&#xff0c;已自动关闭”。 解释&#xff1a; 如此显示&#xff0c;是由于该数据库的AUTO_ CLOSE选项被设为True。 在微软的官…

webAPI中的排他思想、自定义属性操作、节点操作(配大量案例练习)

一、排他操作 1.排他思想 如果有同一组元素&#xff0c;我们想要某一个元素实现某种样式&#xff0c;需要用到循环的排他思想算法&#xff1a; 1.所有的元素全部清除样式 2.给当前的元素设置样式 注意顺序能不能颠倒&#xff0c;首先清除全部样式&#xff0c;再设置自己当前的…

位运算题目-Java实现-LeetCode题解:判断字符是否唯一-丢失的数字-两整数之和-只出现一次的数字 II-消失的两个数字

这里是Themberfue 上一篇文章讲完了常见位运算的技巧以及总结 那么本章则通过五道题来运用这些技巧 判定字符是否唯一 题目解析 本题要求判断给定字符串中的字符是否唯一&#xff0c;也就是每个字符是否只出现一次 算法讲解 本题用哈希表遍历每一个字符也可以解决 如果这题使…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义&#xff1a;**将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个可变维度的耦合度。 2.结构&#xff1a; 抽象化角色 &#xff1a;定义抽象类&#xff0c;并包含一个对实现化…

【conda】创建、激活、删除虚拟环境

前言一、创建虚拟环境二、删除虚拟环境总结 前言 主要是记录一下步骤 一、创建虚拟环境 地址栏输入cmd&#xff0c;唤起命令符栏目&#xff0c;就可以在指定目录下创建虚拟环境了。 这样方便日后在pycharm直接配置虚拟环境。 conda create -n yolo5-lite python3.9 -y简单来说…

诺贝尔物理学奖:机器学习与神经网络的时代

前言 2024年&#xff0c;诺贝尔物理学奖首次颁发给机器学习与神经网络领域的研究者&#xff0c;标志着科学评奖标准的历史性转变。这一决定引发了学术界的广泛关注&#xff0c;也促使人们深入思考科学研究及其应用的未来。 机器学习与物理学的交融 传统上&#xff0c;诺贝尔物…

Linux中部署Mysql保姆级教程

一、版本说明 本文的版本号是5.7.30&#xff0c;5.6及以上版本的MySQL要求Linux系统虚拟内存不能小于1G&#xff0c;否则MySQL可能无法运行。 二、安装前的准备 2.1查看系统自带的Mariadb rpm -qa|grep mariadb 安装mysql为什么需要卸载mariadb&#xff1a; 以前的Li…

ReactOS系统中搜索给定长度的空间地址区间中的二叉树

搜索给定长度的空间地址区间 //搜索给定长度的空间地址区间 MmFindGapTopDown PVOID NTAPI MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown );PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,//寻找的空…

java--网络编程

网络的相关概念 网络通信 1.概念:两台设备之间通过网络实现数据传输2.网络通信:将数据通过网络从一台设备传输到另一台设备3.java.net包下提供了一系列的类或接口&#xff0c;供程序员使用&#xff0c;完成网络通信 网络 概念&#xff1a;两台或多台设备通过一定物理设备连接…

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频&#xff1a; P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

ARM 中断控制器 GIC-V2

GIC-V2 中断控制器架构 参考文档:《ARMGeneric Interrupt Controller Architecture version 2.0》 GIC:Generic Interrupt Controller(GIC) 本文省略中断虚拟化相关章节。 1、Introduction(简介) 中断状态: The following states apply at each interface between the GI…