【算法】串联所有单词的子串【滑动窗口】

题目

给定一个字符串 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 由小写英文字母组成
Related Topics
哈希表
字符串
滑动窗口

题解

滑动窗口
在这里插入图片描述
在这里插入图片描述

实现代码

public List<Integer> findSubstring(String s, String[] words) {List<Integer> lists = new ArrayList<>(); // 结果集列表先初始化int wordsLen = words[0].length(); // 单词长度int count = words.length * wordsLen; // 单词需要组成的字符串的总长度,后面要根据这个去判断是否完成一次窗口的移动int left = 0, right =  0; // 窗口的左边位置和右边位置// 这里必须是map,因为words数组中可能会有多个相同的单词,所以当存在多个相同的单词的时候必须要计数,后面判断的时候必须判断存在之后对map的值进行-1HashMap<String, Integer> map = new HashMap<>();// 将数组转换成数组Arrays.stream(words).forEach(key -> {Integer integer = map.get(key);if (integer == null) {map.put(key, 1);} else {// 同个key存在多个value就++map.put(key, ++integer);}});while (right < s.length()) { // 循环出口HashMap<String, Integer> copyMap = new HashMap<>(map); // 因为每次循环都要判断数组中所有的单词是否耗尽,所以必须每次从原始的map copy一份新的map,保证每次都可以重新分配数组中的所有单词int start = left; // 当前窗口起始位置while (start < left + count) {right = start + wordsLen;if (right > s.length()) {break;}// 截取窗口字符串String substring = s.substring(start, right);// 获取map中的字符串,如果有 value --,没有直接break,当前窗口不存在Integer integer = copyMap.get(substring);if (integer != null && integer > 0) {copyMap.put(substring, --integer);start += wordsLen; // 在当前窗口内继续查找下个单词是否能够匹配if (right - left == count) {lists.add(left);break;}} else {break;}}left ++; // 窗口靠右移动}return lists;
}

在这里插入图片描述

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

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

相关文章

2024 前端高频面试题之 JS 篇

JS 篇&#xff08;持续更新中&#xff09; 1、什么是原型、原型链&#xff1f;2、什么是继承&#xff1f;说一说有哪些&#xff1f;继承组合的原理及优点&#xff1f;3、new 操作符具体干了什么&#xff1f;4、js 有哪些方法改变 this 指向&#xff1f;5、bind 有哪些实现的注意…

通过manifest清单导入项目到gitlab中

文章目录 说明使用manifest得要求Manifest 格式演示示例 说明 从gitlab 11.2引入此功能。 GitLab 允许根据manifest清单文件&#xff08;如 Android 存储库使用的清单文件&#xff09;导入所需的 Git 存储库。 使用manifest得要求 GitLab 必须对其数据库使用 PostgreSQL。至少…

最终Docker6:nacos集群部署

目录 mysql容器构建 1.进入soft 文件夹&#xff0c;创建mysql文件夹 2.进入conf文件夹 放入my.conf 配置文件 3.运行mysql容器 4.进入script文件夹 导入 sql文件 5.进入mysql 容器 并登录 6.创建nacos 数据库并使用&#xff0c;运行nacos.sql文件 7.授予用户所有权限 部…

解析Linux中的VFS文件系统机制(根文件系统的由来)以及 ARM Linux启动流程-根文件系统的加载

《解析Linux中的VFS文件系统机制&#xff08;根文件系统的由来&#xff09;》 以及 《ARM Linux启动流程-根文件系统的加载》两篇文章都是好文章&#xff0c;但是第一篇缺少了rootfs的由来&#xff0c;让人觉得不能融会贯通&#xff0c;缺点火候。 第一篇文章&#xff1a;试图…

朗伯体光源阶数优化

参考&#xff1a; https://wenku.baidu.com/view/2512c78f162ded630b1c59eef8c75fbfc67d946b.html?wkts1705651310970&bdQuery%E6%9C%97%E4%BC%AF%E4%BD%93%E9%98%B6%E6%95%B0 https://www.xjishu.com/zhuanli/62/202211181966.html https://answer.baidu.com/answer/land…

深入理解MyBatis中的#{ }和${ }占位符及参数传递过程

深入理解MyBatis中的#{ }和${ }占位符及参数传递过程 MyBatis是一个广泛使用的持久层框架&#xff0c;它以其强大的数据库访问能力和灵活的SQL映射配置而著称。在MyBatis中&#xff0c;#{ } 和 ${ } 是两种常用的占位符&#xff0c;用于构建动态的SQL语句。本文将深入研究这两种…

扭蛋机小程序搭建:互联网时代下的“潮玩经济”

近几年&#xff0c;潮玩文化逐渐兴起&#xff0c;盲盒经济闯入了各个消费者的视野中。扭蛋机不同于盲盒&#xff0c;包含的产品多数来自于各类热门动漫IP等&#xff0c;这些产品被装进一个扭蛋中&#xff0c;大众根据概率获得不一样的产品。扭蛋机具有产品多样、好玩不贵的特点…

【Git】实习使用记录

Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取 https://blog.csdn.net/wohu1104/article/details/105601657 浏览器可以访问github仓库&#xff0c;但是使用git就用不了 https://blog.csdn.net/m0_63230155/article/details/132070860 可…

uniapp echarts x轴 支持html标签

在 UniApp 中使用 ECharts&#xff0c;也可以通过自定义渲染函数来支持在 x 轴标签中使用 HTML 标签。以下是一个示例代码&#xff0c;展示如何在 UniApp 中使用 ECharts 并支持 x 轴标签中的 HTML 标签&#xff1a; 在 template 中引入 ECharts 组件&#xff0c;并为其设置一…

Vscode安装Eslint扩展后无法实现保存自动修复

前言&#xff1a; 一个现有项目引入eslint时&#xff0c;vscode的eslint扩展会报很多错&#xff0c;通过打开eslint的autoFixOnSave配置自动修复。 从2.0.4版本开始&#xff0c;eslint扩展就移除了autoFixOnSave配置项。因为保存自动修复成为了vscode的Code Action on Save的一…

基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双边滤波数学模型 4.2 双边滤波的特性 4.3 FPGA实现架构 5.算法完整程序工程 1.算法运行效果图预览 将FPGA数据导入到matlab对比测试&#xff1a; 2.算法运行软件版本 vivado2019.2 …

c# 自定义 滑块TrackBar

辛苦半天做出来的&#xff0c;如果觉得好用&#xff0c;记得点赞 效果图如下&#xff1a; 具体操作&#xff1a; 1 、添加代码&#xff08;代码在下面&#xff09;&#xff0c;重新生成下整个工程&#xff0c;在工具栏中就出现控件&#xff0c;将控件拖到窗体中 2、只需要调整…

使用人工智能助手 Github Copilot 进行编程 01

本章涵盖了 AI 助⼿如何改变新程序员的学习⽅式为什么编程永远不会再⼀样了AI 助⼿如 Copilot 的⼯作原理Copilot 如何解决⼊⻔级编程问题AI 辅助编程的潜在危险 在本章中&#xff0c;我们将讨论人类如何与计算机进行交流。我们将向您介绍您的 AI 助手 GitHub Copilot&#x…

dp专题15 零钱兑换

本题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目&#xff1a; 思路&#xff1a; 这道题&#xff0c;是个比较模板的完全背包问题&#xff0c;这里要求的是问凑成总金额所需的最少的硬币的个数。 我们明确一下 dp[ …

QT第四天

要求&#xff1a;使用QT完成计算器UI设计&#xff0c;如下图&#xff1a; 程序运行结果&#xff1a; 代码&#xff1a; mainwindow.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</clas…

MQTT在Web开发中的应用

前文写了使用Docker部署了mqtt服务&#xff0c;今天来写一下&#xff0c;mqtt在web开发中的应用实例&#xff0c;希望能帮到大家&#xff0c;话不多说&#xff0c;直接开始。 一&#xff1a;脚手架安装mqtt 作者这里用的vue3的框架 直接上命令&#xff0c;npm安装或者pnpm进行…

使用pycharm连接读取orcl数据库的表

背景&#xff1a;工作需要 需求&#xff1a;使用pycharm访问远程oracle类型数据库的表&#xff0c;表中包含lob字段&#xff08;这也是个坑&#xff01;&#xff09; 麻了&#xff0c;搞了一个星期&#xff0c;终于成功了&#xff0c;真可谓是每步都有坑&#xff0c;看的文章也…

Microsoft365管理员创建共享邮箱

​​​​​​ 创建共享邮箱 项目2023/08/2110 个参与者 反馈 本文内容 创建共享邮箱并添加成员您应使用哪些权限&#xff1f;阻止登录共享邮箱帐户向 Outlook 添加共享邮箱 显示另外 3 个 备注 如果你的组织使用的是混合 Exchange 环境&#xff0c;则你应使用本地 Excha…

SSH数据流量监控

简介 检查网络连接的数据传输情况有以下一些实际意义&#xff1a; 安全监控&#xff1a;检查数据传输情况可以帮助你识别异常活动或潜在的安全威胁。如果发现大量不寻常的数据传输活动&#xff0c;可能表示有未经授权的访问或恶意行为。通过监控数据传输&#xff0c;可以及时发…

SQLite 3.45.0 发布!

SQLite 开发团队于 2024 年 01 月 18 日发布了 SQLite 3.45.0 版本&#xff0c;带来了一些 JSON 和优化器增强&#xff0c;让我们一睹为快&#xff01; JSON 函数 SQLite 3.45.0 版本开始&#xff0c;所有的 JSON 函数将会使用全新的内部格式存储 JSON 数据&#xff0c;也就是…