leetcode 30. 串联所有单词的子串

题目链接:leetcode 30

1.题目

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

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

例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。 “acdbef” 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

2.示例

1)示例 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)示例 2:
输入:s = “wordgoodgoodgoodbestword”, words = [“word”,“good”,“best”,“word”]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。

3)示例 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”] 顺序排列的连接。

3.分析

首先我们可以明确,假设某个串联子串在s的开始位置为pos,那么有如下结论
1)这个串联子串的长度为words[0].size()*words.size()
2)以words[0].size()对这个子串进行划分,每个单词应该存在于words中,且在words中出现的次数和在子串中出现的次数保持一致
为了确定每个划分的单词是否和words中的单词匹配,我们预先处理,确定对于0<=i<s.size(),以i位置开头且长度为words[0].size()的单词和words中的哪个单词是匹配的
在此基础上,我们可以预先确定一个最暴力的思想,那么就是枚举s中的每个位置作为子串的开始,看是否满足条件,我们在此基础上引入滑动窗口的思想。对于i开头的子串,和对于i+words[0].size()开始的子串,他们不相同的只有[i,i+words.size()-1]以及[i+words[0].size()*words.size()-1,(i+words[0].size()*words.size()-1)+words.size()-1]这两个部分,那么可以只更改这两部分对结果造成的影响即可

4.代码

class Solution {
public:int get_id(string s,vector<string>& words,int st,int num){if(st<0) return -1;string s_test=s.substr(st,num);for(int i=0;i<words.size();i++)if(s_test==words[i]) return i;return -1;}map<int,int> map2;map<string,int> map3;vector<string> words;void get_map2(string s, vector<string>& words){for(int i=0;i<s.size();i++)map2[i]=-1;for(int i=0;i+words[0].size()-1<s.size();i++)for(int j=0;j<words.size();j++){string s1=s.substr(i,words[0].size());if(s1==words[j]) map2[i]=j;}}void get_map3(string s, vector<string>& words2){sort(words2.begin(),words2.end());for(int i=0;i<words2.size();i++)map3[words2[i]]=0;for(int i=0;i<words2.size();i++){map3[words2[i]]++;if(i==0){words.push_back(words2[i]);continue;}if(words2[i]!=words2[i-1])words.push_back(words2[i]);}}vector<int> findSubstring(string s, vector<string>& words2) {int words_length=words2[0].size();int sum_length=words2.size()*words2[0].size();get_map3(s,words2);get_map2(s,words);vector<int> ans;for(int i=0;i<words_length;i++){map<int,int> map1;for(int j=-1;j<words.size();j++)map1[j]=0;for(int j=i;j+sum_length-1<s.size();j+=words_length){bool flag=true;int st1=j-words_length;int st2=j+sum_length-words_length; if(j==i){for(int k=j;k<=st2;k+=words_length)map1[map2[k]]++;}else{map1[map2[st2]]++;map1[map2[st1]]--;}for(int k=0;k<words.size();k++)if(map1[k]!=map3[words[k]]) {flag=false;}if(flag==true) ans.push_back(j);}}return ans;}
};

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

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

相关文章

PyTorch之线性回归

1.定义&#xff1a; 回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。线性回归是利用称为线性回归方程的最小二乘函数&#xff0c;对一个或多个自变量和因变量之间关系&#xff0c;进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参…

LeetCode——1962. 移除石子使总数最小

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个数组。数组中的元素表示石子的个数&#xff0c;我们可以从里面移除一些元素&#xff0c;溢出的规则是第i位置的元素除2后向下取整。并且可以移除k次&#xff0c;要求最后的石子总个数最小。思路一&…

生成allure报告出现:ALLURE REPORT UNKNOWN

问题&#xff1a;点击浏览器查看时无法查看到报告 错误代码&#xff1a; if __name__ "__main__":pytest.main([./test_study/test_fixture.py])os.system("allure generate ./temps -o ./temps --clean") 结果导向&#xff1a; 解决&#xff1a;因为…

Hadoop入门学习笔记——四、MapReduce的框架配置和YARN的部署

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 四、MapReduce的框架配置和YARN的部署4.1. 配置MapReduce…

动态规划03-01背包问题

问题描述 作为动态规划中最重要的经典例题&#xff0c;01背包问题开启了我们学习二维dp数组的道路。 题目如下&#xff1a; 有一个容量为V的背包&#xff0c;还有n个物体。现在忽略物体实际几何形状&#xff0c;我们认为只要背包的剩余容量大于等于物体体积&#xff0c;那就可…

缓存高可用:缓存如何保证高可用?

前面我们提到了缓存集群的负载均衡策略&#xff0c;保证缓存服务的高可用&#xff0c;集群策略是最常用的&#xff0c;本文我们以 Redis 为例&#xff0c;分析一下单点缓存如何扩展到集群&#xff0c;以及集群部署的几种常见模式。 Redis 的主从复制 集群实现依靠副本&#x…

爬虫字典生成工具,CeWL使用教程

爬虫字典生成工具,CeWL使用教程 1.工具概述2.参数解析3.使用实例1.工具概述 CeWL 是一个 ruby 应用程序,它将给定的 URL 爬到指定的深度,可以选择跟随外部链接,并返回一个单词列表,然后可用于密码破解者 Cewl 是黑客武器库中的强大工具,因为它允许创建有针对性的单词列…

如何在Spring Boot中优雅地进行参数校验

1. 前言 在平时的开发工作中&#xff0c;我们通常需要对接口进行参数格式验证。当参数个数较少&#xff08;个数小于3&#xff09;时&#xff0c;可以使用if ... else ...手动进行参数验证。当参数个数大于3个时&#xff0c;使用if ... else ...进行参数验证就会让代码显得臃肿…

使用 Spring Boot + MyBatis开发需要注意的事项以及开发模版

前言&#xff1a; 注意&#xff0c;本篇不适用于有相关开发经验的开发者&#xff0c;作为一个在职开发者&#xff0c;我经常在完成从0-1的模块&#xff0c;也就是从数据库表开始到创建实体类&#xff0c;以及dao层&#xff0c;Service层等业务需要添加相关注解&#xff0c;这样…

pytorch常用的几个函数详解

view view() 是 PyTorch 中的一个常用函数&#xff0c;用于改变张量&#xff08;tensor&#xff09;的形状。在深度学习中&#xff0c;我们经常需要调整数据的形状以适应不同的网络结构或计算需求&#xff0c;view() 函数就是用来完成这个任务的。 基本用法 view() 函数接受…

nn.LSTM个人记录

简介 nn.LSTM参数 torch.nn.lstm(input_size, "输入的嵌入向量维度&#xff0c;例如每个单词用50维向量表示&#xff0c;input_size就是50"hidden_size, "隐藏层节点数量,也是输出的嵌入向量维度"num_layers, "lstm 隐层的层数&#xff0c;默认…

Python---静态Web服务器-多任务版

1. 静态Web服务器的问题 目前的Web服务器&#xff0c;不能支持多用户同时访问&#xff0c;只能一个一个的处理客户端的请求&#xff0c;那么如何开发多任务版的web服务器同时处理 多个客户端的请求? 可以使用多线程&#xff0c;比进程更加节省内存资源。 多任务版web服务器…

计算机网络——网络层(四)

前言&#xff1a; 前面我们已经对物理层和数据链路层有了一个简单的认识与了解&#xff0c;现在我们需要对数据链路层再往上的一个层&#xff0c;网络层进行一个简单的学习与认识&#xff0c;网络层有着极其重要的作用&#xff0c;让我们对网络层进行一个简单的认识与学习吧 目…

Ubuntu:VS Code上C++的环境配置

使用 VSCode 开发 C/C 程序 , 涉及到 工作区的.vscode文件夹下的3个配置文件&#xff08;均可以手动创建&#xff09; : ① tasks.json : 编译器构建 配置文件 ; ② launch.json : 调试器设置 配置文件 ; ③ c_cpp_properties.json : 编译器路径和智能代码提示 配置文件 ; …

神经网络:机器学习基础

【一】什么是模型的偏差和方差&#xff1f; 误差&#xff08;Error&#xff09; 偏差&#xff08;Bias&#xff09; 方差&#xff08;Variance&#xff09; 噪声&#xff08;Noise&#xff09;&#xff0c;一般地&#xff0c;我们把机器学习模型的预测输出与样本的真实label…

详解FreeRTOS:专栏总述

目录 1、理论篇 2、基础篇 3、进阶篇 4、高级篇 5、拓展篇 本专栏基于FreeRTOS底层源码介绍了嵌入式实时操作系统的概念&#xff0c;FreeRTOS任务创建、任务调度、任务同步与消息传递&#xff0c;软件定时器、事件通知等知识。 主要分为5方面内容&#xff1a;理论篇、基础…

Python中json模块的使用与pyecharts绘图的基本介绍

文章目录 json模块json与Python数据的相互转化 pyecharts模块pyecharts基本操作基础折线图配置选项全局配置选项 json模块的数据处理折线图示例示例代码 json模块 json实际上是一种数据存储格式&#xff0c;是一种轻量级的数据交互格式&#xff0c;可以把他理解成一个特定格式…

spring核心组件详细分析图

文章目录 spring核心组件 spring核心组件 spring七大组成部分 1、核心容器 这是Spring框架最基础的部分&#xff0c;它提供了依赖注入&#xff08;DependencyInjection&#xff09;特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory&#xff0c;它是任何Spring应用…

python dash 写一个登陆页 4

界面 代码&#xff1a; 这里引入了dash_bootstrap_components 进行界面美化 &#xff0c;要记一些className&#xff0c;也不是原来说的不用写CSS了。 from dash import Dash, html, dcc, callback, Output, Input, State import dash_bootstrap_components as dbcapp Dash(…