【刷题笔记】串联所有单词的子串||暴力通过||滑动窗口

串联所有单词的子串

1 题目描述

https://leetcode.cn/problems/substring-with-concatenation-of-all-words/

给定一个字符串 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”] 顺序排列的连接。

2 思路

这个题虽然是Hard,但是我感觉这也是一个靠暴力做的题,没有涉及到太多的技巧。

我的想法是,首先统计words中的每个字符串的数量:

在这里插入图片描述

然后以word.length * word[0].length大小的窗口对s进行遍历,统计每个窗口中分割出的元素数量。

在这里插入图片描述

如果符合,就添加进返回列表中。

3 详细设计

首先,我们对words里面的每个字符串进行编码:

Map<String, Integer> maps = new HashMap<>();
int pos = 0;
for (String str :words) {if (!maps.containsKey(str)) {maps.put(str, pos++);}
}

这样,我们就可以给予words中每个字符串一个唯一的编号,pos记录了一共有多少种word。

接下来我们统计每个word的出现次数:

int[] counts = new int[pos];
for (String str :words) {counts[maps.get(str)]++;
}

最后,我们设置窗口:

int end = total_len - 1; // 窗口的大小为total_len=word.length * word[0].length()
int start = 0;
while (end < s.length()) {int[] temp_table = new int[pos];for (int i = 0; i < words.length; i++) {// 对窗口内的单词进行分割遍历,// s.substring(start + i * single_word_len, start + (i + 1) * single_word_len)// 表示s的第(start+1)个窗口中的第(i+1)个单词String t = s.substring(start + i * single_word_len, start + (i + 1) * single_word_len);if (! maps.containsKey(t)) break; // 如果窗口中出现了不属于words中的字符串,跳出此次循环。temp_table[maps.get(t)]++; // 统计第(start+1)个窗口中的第(i+1)个单词的出现次数}boolean flag = true;for (int i = 0; i < pos; i++) {if (temp_table[i] != counts[i]) { // 判断相应单词的出现次数与words中是否一致flag = false; // 一旦有一个不一致的,设置标志位为falsebreak;}}if (flag) reslist.add(start);start++;end++;
}

整体的时间复杂度应该是接近O(n*2*word.length)

4 代码

class Solution {public List<Integer> findSubstring(String s, String[] words) {Map<String, Integer> maps = new HashMap<>();List<Integer> reslist = new ArrayList<>();int total_len = words.length * words[0].length();int single_word_len = words[0].length();int pos = 0;for (String str :words) {if (!maps.containsKey(str)) {maps.put(str, pos++);}}int[] counts = new int[pos];for (String str :words) {counts[maps.get(str)]++;}int end = total_len - 1;int start = 0;while (end < s.length()) {int[] temp_table = new int[pos];for (int i = 0; i < words.length; i++) {String t = s.substring(start + i * single_word_len, start + (i + 1) * single_word_len);if (! maps.containsKey(t)) break;temp_table[maps.get(t)]++;}boolean flag = true;for (int i = 0; i < pos; i++) {if (temp_table[i] != counts[i]) {flag = false;break;}}if (flag) reslist.add(start);start++;end++;}return reslist;}
}

在这里插入图片描述

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

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

相关文章

arXiv学术速递笔记11.29

文章目录 一、自动驾驶/目标检测Improving Lane Detection Generalization: A Novel Framework using HD Maps for Boosting DiversityTowards Full-scene Domain Generalization in Multi-agent Collaborative Birds Eye View Segmentation for Connected and Autonomous Driv…

Linux 磁盘管理详细指南

目录 前言 显示文件系统的磁盘空间 显示文件或目录的磁盘空间 lsblk 列出块设备信息 fdisk 磁盘分区 mkfs 格式化分区 Swap mount 挂载 前言 可以使用图形界面工具来进行分盘、挂载等操作&#xff0c;这会更直观和易于操作。 显示文件系统的磁盘空间 "df"命…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍IIC通信简单介绍…

【每日一题】1657. 确定两个字符串是否接近-2023.11.30

题目&#xff1a; 1657. 确定两个字符串是否接近 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的…

RSA实现中弱密钥漏洞分析(Analyzing Weak Key Vulnerabilities in RSA Implementation)

点我完整下载&#xff1a;《RSA实现中弱密钥漏洞分析》本科毕业论文一万字.doc RSA实现中弱密钥漏洞分析 "Analyzing Weak Key Vulnerabilities in RSA Implementation" 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 4 1.2 研究目的 5 1.3 研究意义 6 第…

【随笔】个人面试纪录

面试被问了几个问题。 1.mount怎么用 没答上来&#xff0c;说的 --help 可以看 mount --help | less mount [ --source ] <source> | [ --target ] <target> 2.ansible怎么用&#xff0c;有哪些常用的模块 ansible <hosts|all> -m <module> 常用的模块…

vue运用el-table常见问题及案例代码

前言 el-table 是 Element UI 的一个组件,用于在 Vue.js 应用程序中创建数据表格。下面是一些常见的 el-table 问题以及相应的案例代码。 如何动态加载数据?你可以通过使用 v-model 指令和 el-table-column 组件来动态加载数据。以下是一个示例: <template> <el…

解决plot画图中文乱码问题(macbook上 family ‘sans-serif‘ not found)

一、matplotlib画图中文乱码问题 使用matplotlib.pyplot画图&#xff0c;有中文字体会显示乱码问题&#xff0c;这时需要添加如下代码&#xff1a; import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]二、macbook没有SimHei的…

分布式仿真SNN的思考

我之前实现的仿真完全基于如下图设计的 将整体的网络构成见一个邻接表&#xff0c;突触和神经元作为类分别存储&#xff0c;所以当一个神经元发射脉冲时&#xff0c;很容易的将脉冲传输到突触指向的后神经元。但是在分布式方丈中&#xff0c;由多个进程仿真整体的网络&#xff…

WPS导出的PDF比较糊,和原始的不太一样,将带有SVG的文档输出为PDF

一、在WPS的PPT中 你直接输出PDF可能会导致一些问题&#xff08;比如照片比原来糊&#xff09;/ 或者你复制PPT中的图片到AI中类似的操作&#xff0c;得到的照片比原来糊&#xff0c;所以应该选择打印-->高级打印 然后再另存为PDF 最后再使用AI打开PDF文件再复制到你想用…

【驱动】SPI驱动分析(七)-SPI驱动常用调试方法

用户态 用户应用层使用spidev驱动的步骤如下&#xff1a; 打开SPI设备文件&#xff1a;用户可以通过打开/dev/spidevX.Y文件来访问SPI设备&#xff0c;其中X是SPI控制器的编号&#xff0c;Y是SPI设备的编号。配置SPI参数&#xff1a;用户可以使用ioctl命令SPI_IOC_WR_MODE、S…

trait 特征

trait&#xff08;特征&#xff09;RUST用来以一种抽象的方式来定义共享行为&#xff0c;还可以使用trait约束用来将泛型参数指定为实现了某些特征行为的类型。通过trait将特定方法签名组合起来&#xff0c;用来实现某种目的所必须的行为集合。 pub trait Summary {fn summari…

中国技协城市主产业职业技能(上海)联赛暨全 国网络与信息安全管理员职工职业技能竞赛—线上赛初赛a

目录 一、理论题 二、CTF 1.赛前测试:f12_me 2.WEB:VersionControl 3.MISC:SecretDocume 4.Reverse:pyc

基于单片机的排队叫号系统设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个节日彩灯门&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 基本要求&#xff1a;利用单片机AT89C51设计排队叫号机&#xff0c;能实现叫号功能。 创新&#xff1a;能显示叫号…

猫头虎分享ubuntu20.04下VSCode无法输入中文解决方法

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

qt 5.15.2 的编译部署quazip-0.7.3项目过程

qt 5.15.2 的编译部署quazip-0.7.3项目过程 &#xff08;一&#xff09;先下载quazip-0.7.3项目源代码 下载地址&#xff1a;https://sourceforge.net/projects/quazip/ 更新版本参考地址下载&#xff1a;https://github.com/stachenov/quazip (二) 用qt creater打开下载的q…

【网络控制】

网络控制 “网络控制”&#xff08;Network Control&#xff09;通常指的是通过网络对远程设备、系统或服务进行管理和监控的过程。这可以包括远程设备的配置、监测、故障排除、升级等操作。网络控制的目的是在分布式环境中实现对各种网络设备和资源的远程管理。 网络控制的关…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …

基于C++11实现通过/sys/class/net/eth1/operstate文件获取eth1网口

在Linux系统中&#xff0c;网口&#xff08;网络接口&#xff09;的状态信息可以在/sys/class/net/<interface>/operstate文件中查看。其中&#xff0c;<interface>是您要查看状态的具体网口名称。 例如&#xff0c;要查看eth1网口的状态&#xff0c;可以使用以下…

算法通关村第一关—链表高频面试题(白银)

链表高频面试题 一、五种方法解决两个链表的第一个公共子节点的问题 面试 02.07.链表相交1.首先想到的是暴力解&#xff0c;将第一个链表中的每一个结点依次与第二个链表的进行比较&#xff0c;当出现相等的结点指针时&#xff0c;即为相交结点。虽然简单&#xff0c;但是时间…