算法——滑动窗口之找到字符串中所有的字母异位词,串联所有单词的子串

6.找到字符串中所有的字母异位词

题目:. - 力扣(LeetCode)

6.1如何快速判断两个字符串是否是异位词

假设现在有s1 = 'aabca',s2 = 'abaca',那么这两个就是异位词,容易想到的判断方法就是将两个字符串按照字典序排序,再依次比较,但是时间复杂度很高;我们看看下面这种解法:不难发现如果两个字符串为异位词,那么他们之间的相同字符的个数也是相同的,如a有3个,b一个,c一个.那么我们就可以通过判断两个字符串中每种字符的个数是否相同,相同则是异位词,这个功能我们可以利用hash表来实现

6.2解决问题
 s = "cbaebabacd", p = "abc"

暴力解法当然是找出s中的所有长度为p.length 的子串,通过hash来判断是否为异位词,

我们在暴力解法上进行优化:

当我们判断前三个字符后,没必要将right回到b的位置再继续列举,因为实际上我们下一个要判断的是字符串"bae",但是我们在hash2中已经记录了b a的信息,我们只需将c移除hash2,再将a移入hash2即可.这就是滑动窗口的问题,与前面的题目不同的是,这里我们维护的窗口长度是固定的

滑动窗口步骤:

in表示right的元素,out表示left的元素

(1)进窗口 :hash2[in]++

(2)判断 如果 right - left + 1 > p.length,那么就要出窗口

(3)出窗口:hash2[out]--

(4)更新结果:判断hash1 和 hash2 字符情况是否相同

在此步骤判断的时候,如果按照上述的步骤来,我们可以建立两个长度为26的数组作为hash表,每次变量两个数组来判断是否相同,加上滑动窗口,时间复杂度为O(26n),即O(n)

这里是因为判断的为单个字符的数量,但是如果题目是要判断字符串的数量呢??

因此我们进行优化:利用count 来统计窗口中"有效字符"的个数

假设我们的字符串为:

我们的步骤是:

在进窗口时:

如此时,在hash2[in] ++之后,我们需要判断hash2[in] 与hash1[in] 的大小关系,如果hash2[in] <= hash1[in],那么说明我们加进来的是一个"有效字符",所谓的有效字符即我们这个字符能低效掉hash1中的某个字符

我们将right++,

此时由于hash2[in] > hash1[in],说明不是一个有效字符,那么count++,同理right再++

为有效字符,count更新为2

我们只需判断count 是否 等于 p.length即可,如果相等,那么即为异位词,并且我们这个判断可以穿插在每一次外循环中,因为只有count = p.length才能更新结果

当我们再次right++后,

这时候就要出窗口了,再出窗口时,我们依旧要判断hash2[out] 与hash1[out] 的大小关系,如果hash2[out] <= hash1[out],那么说明我们移出去的是一个"有效字符",那么count--,反之则不用

题解:

 public static List<Integer> findAnagrams(String s, String p) {List<Integer> ret = new ArrayList<>();int[] hash1 = new int[26];int[] hash2 = new int[26];for(int i = 0; i < p.length(); i++){hash1[p.charAt(i) - 'a']++;}for(int left = 0,right = 0,count = 0; right < s.length(); right++){int in = s.charAt(right) - 'a';hash2[in]++;if(hash2[in] <= hash1[in]){count++;}if(right - left + 1 > p.length()){int out = s.charAt(left++) - 'a' ;if(hash2[out] <= hash1[out]) {count--;}hash2[out]--;}if(count == p.length()){ret.add(left);}}return ret;}

7.串联所有单词的子串

题目:. - 力扣(LeetCode)

理解题目后,如果我们做过滑动窗口的第6题,就会发现这道题和异位词实际上非常相似,只不过将原先的一个个单词转化为一个个字符串

具体的算法原理在第6题已经说过,我们来看看不同点

(1)哈希表

本题的hash表需要用Map<String,int>来实现

(2)left和right的次数

题目规定,words里面的单词都是等长的,我们记这个长为len,那么我们的left和right每次就都要移动len个字符,以实现跨过一个单词

(3)滑动窗口的执行次数

题目可能会出现"lingmindraboofooowingdingbarrwingmonkeypoundcake" ["fooo","barr","wing","ding","wing"]这样的情况,即left和right可能不是从0下标开始移动的

如上图,我们会发现找不到答案,而事实上还有下面几种可能:

当我们left从m开始的时候,会发现和第一种是一样的,因此我们只需要进行4次,而刚好是执行次数刚好是字符串的长度

也是由于这个问题,我们right的循环结束条件应该为:right + len <= s.length

题解:

 class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> list = new ArrayList<>();Map<String,Integer> hash1 = new HashMap<>();for(String str : words){hash1.put(str,hash1.getOrDefault(str,0)+1);}int len = words[0].length(),m = words.length;for(int i = 0; i < len; i++){Map<String,Integer> hash2 = new HashMap<>();for(int left = i,right = i,count = 0; right + len <= s.length(); right += len){String in = s.substring(right,right+len);hash2.put(in,hash2.getOrDefault(in,0)+1);if(hash2.get(in) <= hash1.getOrDefault(in,0)){count++;}if(right-left+1 > len * m){String out = s.substring(left,left+len);if(hash2.get(out) <= hash1.getOrDefault(out,0)){count--;}hash2.put(out,hash2.get(out)-1);left += len;}if(count == m){list.add(left);}} }return list;}}

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

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

相关文章

乌干达公司注册优势 乌干达公司注册的条件 乌干达公司注册的流程

乌干达公司注册优势 1、乌干达拥有稳定的政 治环境和开 放的市场经济&#xff0c;为企业提供了良好的发展机遇。 2、乌干达有着优越的地理位置&#xff0c;位于东非内陆&#xff0c;毗邻肯尼亚、坦桑尼亚和刚果&#xff08;金&#xff09;&#xff0c;是通往东非和中非的理想…

精通MySQL:从下载到部署,一切尽在掌握

MySQL数据库下载及安装教程 MySQL是一款广泛应用于各类项目的开源关系型数据库管理系统。它基于Structured Query Language&#xff08;SQL&#xff09;进行数据操作&#xff0c;具有高性能、易使用、成本低等优点。在这篇文章中&#xff0c;我们将向你介绍如何在不同操作系统…

代码随想录算法训练营第五十天| 583. 两个字符串的删除操作 、72. 编辑距离

文章目录 1.两个字符串的删除操作2.编辑距离 1.两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 “sea”, word2 “eat” 输出: 2 …

分享软件项目实施方案模板

本项目在实施过程中将遵守做到以下几个方面&#xff1a; 与建设单位共同完成整个系统软件、网络等设计,负责系统的开发、测试、调试、人员培训、系统的试运行和交付&#xff0c;并保证系统质量。负责系统的维护、应用软件的升级和更新。提出对系统硬件设备的相关技术要求。在项…

vue3 动态路由及使用动态路由后刷新界面出现空白页或者404

最近编写vue3动态路由的功能遇到了一些问题&#xff0c;处理好了&#xff0c;总结出来&#xff0c;希望能帮助到你。正片开始 先写好本地缓存菜单的方法&#xff08;存储、删除、获取&#xff09; // utils/menu.jsconst getMenuList () > {return JSON.parse(localStorag…

MachineSink - 优化阅读笔记

注&#xff1a;该优化与全局子表达式消除刚好是相反的过程&#xff0c;具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中&#xff0c;以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全…

【大厂AI课学习笔记NO.80】深度学习行业人才能力图谱

深度学习领域的就业岗位及所需关键技术、工具、能力分析 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来得到了飞速的发展。随着技术的不断进步和应用场景的不断拓展&#xff0c;深度学习领域的就业岗位也日益增多。本文将从领军人才、产业研发人才、应用开发人才…

Linux——信号

目录 什么是信号 Linux下的信号 信号的记录 信号处理的常见方式 产生信号 使用组合键产生信号&#xff08;包含core dump&#xff09; 使用系统调用向进程发送信号 由软件条件产生信号 由硬件异常产生信号 阻塞信号 内核表示 sigset_t 信号集操作函数 sigpendin…

jvm八股

文章目录 运行时数据区域Java堆对象创建对象的内存布局对象的访问定位句柄直接指针 GC判断对象是否已死引用计数算法可达性分析算法 引用的类别垃圾收集算法分代收集理论标记清除算法标记复制算法标记整理算法 实现细节并发的可达性分析 垃圾收集器serial收集器ParNew收集器Par…

如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

目录 一、面试官心理分析 二、面试题剖析 1.Redis 主从架构 2.Redis replication 的核心机制 3.Redis 主从复制的核心原理 4.主从复制的断点续传 5.无磁盘化复制 6.过期 key 处理 7.复制的完整流程 8.全量复制 9.增量复制 10.heartbeat 11.异步复制 12.Redis 如何…

【三十】springboot项目上高并发解决示例

互相交流入口地址 整体目录&#xff1a; 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…

工程经济学二

一、名词解释 可行性分析&#xff1a; 可行性研究是在投资项目拟建之前&#xff0c;通过对与项目有关的市场、资源、工程技术、经济和社会等方面的问题进行全面分析、论证和评价&#xff0c;从而确定项目是否可行或选择最佳实施方案的一项工作 厂址选择 厂址选择是指在一个大…

Java学习记录(十六):IO流(三)

缓冲流 缓冲流是一种高级流&#xff0c;可以理解为将基本流包装成了这种高级流&#xff0c;而这种高级流的特点就是将一个缓冲区放入到基本流当中&#xff0c;从而提高基本流的效率&#xff0c;但实际进行读写操作的还是基本流 下面为缓冲字节输出流和缓冲字节输入流的应用&am…

2024考研王道计算机408数据结构+操作系统+计算机组成原理+计算机网络

2024考研王道计算机408数据结构操作系统计算机组成原理计算机网络 链-接&#xff1a;https://pan.baidu.com/s/152XLyH64TlcLXwmU-zlAsQ?pwdr7zf 提取码&#xff1a;r7zf 信道利用率在408中经常考察到这里&#xff0c;我给大家总结一下这一类题目的做题方法以及技巧。首先&a…

全量知识系统问题及SmartChat给出的答复 之20 语义关联+词扇+叙词库 之1

Q67. 请问语义关联和词扇之间有什么关系&#xff1f; 语义关联和词扇是两种不同的概念&#xff0c;但它们之间有一定的关系。 语义关联指的是词语之间在语义上存在联系或关联&#xff0c;可以是同义关系、反义关系、上下位关系等。而词扇是指一个中心词周围所有与之相关的词语…

深度强化学习(二)

#! https://zhuanlan.zhihu.com/p/686235508 深度强化学习(二)(贝尔曼方程) 一.贝尔曼方程&#xff08;将 Q π Q_\pi Qπ​ 表示成 Q π Q_\pi Qπ​ &#xff09; Theorem :假设 R t R_t Rt​ 是 S t 、 A t 、 S t 1 S_t 、 A_t 、 S_{t1} St​、At​、St1​ 的函数。…

基于SpringBoot疫情打卡健康评测系统

基于SpringBoot疫情打卡健康评测系统~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 学生端功能效果展示 试卷表 在线考试 打卡管理 居家管理 学生返校申请管理 管理…

救命!我终于会写一份简单的产品说明书了

写一份简单的说明书其实也不简单&#xff0c;需要有前期的调研准备&#xff0c;撰写时的条框梳理&#xff0c;收尾的清晰明了。网络上有很多撰写产品说明书的方法&#xff0c;却也有一些模糊的地方&#xff0c;下面就来看看LookLook同学是怎么完成一份简单的产品说明书的。 一、…

【Python】一文详细介绍plt.rcParams 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍plt.rcParams 在 Matplotlib 中的原理、作用、注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x…

53. 最大子数组和(力扣LeetCode)

文章目录 53. 最大子数组和题目描述暴力&#xff08;运行超时&#xff09;贪心 53. 最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组…