力扣精选算法100题——串联所有单词的字串(滑动窗口专题)

本题链接——串联所有单词的字串

本题和找到字符串中所有字母异位词题目非常相似,思路都是一样。通过自己的大脑能发现其中的相似之处。

第一步:了解题意

就按实例来分析吧,这样更通俗易懂。

  • words=["ab","cd","ef"],这是一个字符串数组,里面的每个字符串长度都是相等的。
  • words里面的字符串串联起来的顺序有 "abcdef", "abefcd""cdabef", "cdefab""efabcd", 和 "efcdab" 都是串联子串,但是这个不是"acdbef",因为每个字符串的"ab","cd","ef"都是固定顺序,是不能修改的。
  • 比如s="abbcdefab",这里就存在串联字串"cdefab",每个字符串里面的字符顺序相同字符串数组中各个字符串顺序可以不同,都是可以的。
  • 连接的子字符串的长度必须是words字符串数组中(每个字符串长度*字符串的个数)

其中s字符串中就有存在。 

只要返回符合条件的字符串的起始索引即可。


第二步:算法原理

我们有没有发现 “找到字符串中所有字母异位词” 是找匹配的字符,字符顺序可以改变 ,这一题找到字符串匹配即可,每个字符串顺序可以改变。

现在看是不是一样了,每个字符串里面的字符顺序是不能改变的,但是字符串顺序可以改变。

所以就延申了"字母异位词"思路了。

不同之处:

1.哈希表:

“找到字符串中所有字母异位词”这个题目记录的是字母的个数——用哈希表模拟数组

”串联所有单词的字串“这个题目记录的是字符串的个数——用unordered_map<string,int>表示字符串出现的次数。

2.left和right

移动的步数不再是1,而是每个字符串的长度

3.窗口的执行次数

每个字符串长度len次

这里有个小细节就是 

第三步:实现代码

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int>ret;unordered_map<string,int> hash1;//保存word里面的所有单词的频次for(auto s:words)hash1[s]++;//对每个字符串进行计数int len=words[0].size(),m=words.size();for(int i=0;i<len;i++){unordered_map<string,int>hash2;//维护窗口内的单词频次for(int left=i,right=i,count=0;right+len<=s.size();right+=len){//进窗口+维护countstring in=s.substr(right,len);hash2[in]++;if(hash1.count(in)&&hash2[in]<=hash1[in])count++;//先判断in字符串是否在hash1表中存在,如果存在那么就进行下一步//判断if(right-left+1>len*m){//出窗口+维护countstring out=s.substr(left,len);if(hash1.count(out)&&hash2[out]<=hash1[out])count--;hash2[out]--;left+=len;}//更新结果if(count==m) ret.push_back(left);}}return ret;}
};

是c++还是java?

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

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

相关文章

mysql从库重新搭建的流程

背景 生产环境上的主从集群&#xff0c;因为一些异常原因&#xff0c;导致主从同步失败。现记录下通过重做mysql从库的方式来解决&#xff0c;重做过程不影响主库。 步骤 1、在主库上的操作步骤 备份主库所有数据&#xff0c;并将dump.sql文件拷贝到从库/tmp目录 mysqldump …

Flutter 综述

Flutter 综述 1 介绍1.1 概述1.2 重要节点1.3 移动开发中三种跨平台框架技术对比1.4 flutter 技术栈1.5 IDE1.6 Dart 语言1.7 应用1.8 框架 2 Flutter的主要组成部分3 资料书籍 《Flutter实战第二版》Dart 语言官网Flutter中文开发者社区flutter 官网 4 搭建Flutter开发环境参考…

vue3-模版引用

模版引用 ref 属性 场景&#xff1a;需要直接访问底层 DOM 元素。 方法&#xff1a;使用特殊的 ref 属性。 <input ref"input">ref 属性 允许我们在一个特定的 DOM 元素或子组件实例被挂载后&#xff0c;获得对它的直接引用。 访问模板引用 小 Demo: 当 i…

Go 知识iota

Go 知识iota 1. 介绍2. 特性3. 原理4. 你真的理解了吗 1. 介绍 iota 是一个预定义的标识符&#xff0c;用于声明枚举常量。它在 const 声明中使用&#xff0c;表示连续的未类型化整数。其值从0开始&#xff0c;const声明块每增加一行&#xff0c;iota的值就会自增1&#xff0c…

优化您的服务请求,增强用户体验和服务交付

您的服务请求模板是否像一个复杂的迷宫&#xff0c;给您的团队带来延误和困惑&#xff1f;您的技术人员是否厌倦了为了解最终用户的需求而与他们来回奔波&#xff1f;强大且可定制的请求模板可能正是您所需要的&#xff01; 服务交付团队&#xff08;尤其是 IT&#xff09;的…

javascript入门分享(附:javascript基础入门视频教程)

javascript入门分享&#xff08;附&#xff1a;javascript基础入门视频教程&#xff09; 一、javascript入门了解 JavaScript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。 虽然它是作为开发Web页面的脚本语言而出…

Node.js Stream.pipeline() Method

Why Stream.pipeline 通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来&#xff0c;而无需一次性全部读入&#xff0c;在 Linux 下我们可以通过 | 符号实现&#xff0c;类似的在 Nodejs 的 Stream 模块中同样也为我们提供了 pipe() 方法来实现。 未使用 Stream p…

基于WSL的Ubuntu命令行美化

大多数 Linux 发行版中的默认 Shell 是 Bash。Bash 缺乏代码高亮&#xff0c;不易阅读。本文旨在通过安装 Zsh、oh-my-zsh&#xff0c;并应用 Powerlevel10k 主题来解决这一问题。 环境&#xff1a;Windows10 Pro 21H2&#xff0c;OS build: 19044.1766&#xff1b;基于 WSL 的…

JVM之java内存区域[1](程序计数器、栈)

文章目录 版权声明零 运行时数据区一 程序计数器1.1 加载阶段1.2 执行阶段1.3 多线程情况 二 栈2.1 java虚拟机栈2.2 java虚拟机栈帧的组成2.2.1 局部变量表2.2.2 操作数栈2.2.3 帧数据 2.3 栈内存溢出2.4 设置帧大小2.5 本地方法栈 版权声明 本博客的内容基于我个人学习黑马程…

Java学习笔记(八)——Lambda表达式

文章目录 Lambda表达式Lambda表达式的省略写法Lambda练习练习1练习2 算法题算法题1 斐波那契数列算法题2 猴子吃桃子算法题3 爬楼梯 Lambda表达式 Lambda表达式是JDK8开始的一种新语法形式。 基本作用&#xff1a;简化函数式接口的匿名内部类的写法。 注意&#xff1a; Lam…

Linux中的新建用户、切换用户

目录 一、Linux系统中有哪些用户 二、新建普通用户 三、root账号与普通账号的切换 一、Linux系统中有哪些用户 1.root 超级管理员&#xff08;不受权限约束&#xff09; 2.其他用户 普通用户&#xff08;受到权限约束&#xff09; 二、新建普通用户 创建新用户 sudo user…

【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表 1、顺序表的定义&#xff1a; 线性表的顺序存储结构&#xff0c;即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的&#xff0c;可以通过数据元素的物理存储位置来反映其逻辑关系。…