力扣精选算法100题——找到字符串中所有字母异位词(滑动窗口专题)

本题链接👉找到字符串中所有字母异位词


第一步:了解题意

给定2个字符串s和p,找到s中所有p的变位词的字串,就是p是"abc",在s串中找到与p串相等的字串,可以位置不同,但是字母必须相同,比如”bca","bac"等,都是可以被称之为变位词。最终返回与p串字母相等但排列不同的字符串的初始索引即可。

例如 P="abc" { "abc","acb","cab","cba"}都是它的异位词。

S=“cbaebabacd" P="abc"

符合条件的2组"cba"起始索引是0,"bac"起始索引是6,所以结果是[0,6].


第二步:算法原理

首先看到这个题目我们就会想到如何快速判断2个字符串是否是"异位词"

  • 统计字符串中字符出现个数统计 统计就用hash表

这时候我们就想到了hash表,哈希表用来记录出现个数,对于下标的映射。首先给hash表各个元素都设置成0,然后依次存入a计入,然后让字符a的个数++,a的映射就是1,依次记录。所以p和s的字符串都用hash表来记录。

第一种解法:暴力枚举+哈希

首先我们将P字符串依次存入hash1表中,Q字符串依次存入hash2表中。

定义2个指针都从头开始,依次计入hash2表中,然后当right-left+1>P字符串的长度时候,我们就判断俩个哈希表是否相等。然后清空hash2表。

再存入新的值之前我们需要给"cba"存入hash2表值去才能重新存入。

这样我们看着肯定是很繁琐的,为什么right要重新回到left下一个位置重新开始呢?为什么不right++呢?这就是可以优化的地方。

所谓优化就是:

right不往回跑,left往后++,就是删除left所在的位置的值在hash2表中,增加right后面对应的值存入hash2表中。


第二种解法:滑动窗口+哈希

滑动窗口的模板:

1.left=0,right=0;

2.进窗口

3.判断

4.出窗口

更新结果(这是是在上面的4个步骤中根据题目的不同来穿插的)

2.进窗口

将right对应的值存入到hash2表中去。

3.判断

当right-left+1>len(p),那么我们就要进行判断了。这时候开始出窗口了。

4.出窗口

出窗口其实就是left对应的值从hash2表中删除,然后left++即可。

肯定很多人想知道这里是如何更新结果的,我们如何和p字符串进行判断?

❗5.更新结果

我们可以再进窗口的时候就对其进行操作为后续的更新结果奠定基础。

主要进行的步骤就是 进窗口(后)对count的更新 和 出窗口(前)对count的更新

利用count变量来统计窗口中"有效字符"的个数

in和out就是对应的字符

进窗口:进入后 hash2[in]<=hash1[in] count++;

出窗口:  出去前 hash2[out]<=hash1[out] count--;

更新结果 count==len(p) ;

进窗口+count维护


更新结果


出窗口+count维护

这就是进窗口(后)和出窗口(前)进行count维护。


第三步:实现代码

class Solution {
public:vector<int> findAnagrams(string s, string p) {int hashp[26]={0};//统计p字符串中各字符的个数vector<int>ret;//记录结果for(auto ch:p) hashp[ch-'a']++;int hashs[26]={0};//统计s字符串中各字符的个数int left=0,right=0;int len=p.size(),count=0;while(right<s.size()){if(++hashs[s[right]-'a']<=hashp[s[right]-'a'])count++;//进窗口+维护countif(right-left+1>len)//判断{if(hashs[s[left]-'a']--<=hashp[s[left]-'a'])count--;//出窗口+维护countleft++;}//更新结果if(count==len) ret.push_back(left);right++;}return ret;}
};

小知识:


正在寒假的提升版。

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

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

相关文章

区域入侵/区域人数统计AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;硬件内置了近40种AI算法模型&…

初识C++模板

1 引入模板 实现一个算法&#xff1a;返回两个变量中的较大的一个&#xff0c;并支持不同的数据类型。如果不使用C模板&#xff0c;会有哪些选择呢&#xff1f; 根据数据类型一遍一遍实现算法 int max_int(int x, int y) {return x > y ? x : y; }int max_double(double x…

【Linux系统编程】环境变量的组织方式

environ和getenv函数 在Linux中&#xff0c;environ是一个全局的外部变量&#xff0c;其类型为char**&#xff0c;存储着系统的环境变量。除了使用主函数中的第三个参数外&#xff0c;我们也可使用environ函数直接访问系统的环境变量。 注意&#xff1a;这里在代码内部使用envi…

[labelme]labelme如何将标注的json格式转成png的mask文件掩码文件

labelme工具不仅仅具有标注功能&#xff0c;而且可以将json文件转化为png的分割训练文件&#xff0c;如果您是一个类别则可以直接用labelme_json_to_dataset进行转换最后提取对应的掩码文件即可进行语义分割训练。如果您是>2个类别则不推荐使用labelme工具进行转换&#xff…

Liunx:线程控制

目录 创建线程&#xff1a;pthread_create(); 线程等待&#xff1a;pthread_join(); 线程退出&#xff1a;pthread_exit(); 线程取消&#xff1a;pthread_cancel() 说线程的时候说过&#xff0c;liunx没有选择单独定义线程的数据结构和适配算法&#xff0c;而是用轻量级进程…

软件测试|深入了解Python中的super()函数用法

简介 Python中的super()函数是一种强大的工具&#xff0c;用于在子类中调用父类的方法。它在面向对象编程中非常有用&#xff0c;可以让你轻松地扩展和重用现有的类。本文将详细介绍super()函数的用法&#xff0c;并提供一些示例来帮助你更好地理解它的功能。 什么是super()函…

el-date-picker如果超过限制跨度则提示

需求&#xff1a;实现日期时间选择组件跨度如果超过限制天数&#xff0c;点击查询则提示超过限制时间 封装一个方法&#xff0c;传入开始和结束时间以及限制天数&#xff0c;如果超过则返回false //计算时间跨度是否超过限制天数isTimeSpanWithinLimit(startTime, endTime, li…

Firefox 100 正式发布

五月三日&#xff0c;Firefox发布了它的第100个版本&#xff0c;来回顾一下Firefox是如何走到今天这一步的&#xff0c;以及在第100个版本中发布了哪些功能。 回顾 2004年&#xff0c;《纽约时报》上宣布了Firefox 1.0的发布&#xff0c;这个广告列出了为第一版做出贡献的每一…

Seaborn可视化的各种图及代码演示

一.简介 Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面&#xff0c;便于用户能够做出各种有吸引力的统计图表。 Seaborn是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;在大多数情况下使用seaborn能做…

Modbus协议学习第三篇之协议通信规则

导语 本篇博客将深入介绍Modbus协议的一些内容&#xff0c;主要包括通讯方式和通讯模型的介绍 Modbus通讯方式 Modbus协议是单主机、多从机的通信协议&#xff0c;即同一时间&#xff0c;总线上只能有一个主设备&#xff0c;但可以有一个或者多个从设备&#xff08;最多好像是2…

SpringMVC下半篇之异常处理器及日期转换器

3.异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 3.1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由…

图像处理中,采用极线约束准则来约束特征点匹配搜索空间,理论上在极线上进行搜索。这里的极线是什么线,怎么定义的?基本矩阵F和本质矩阵E有什么区别?

问题描述&#xff1a;图像处理中&#xff0c;采用极线约束准则来约束特征点匹配搜索空间&#xff0c;理论上在极线上进行搜索。这里的极线是什么线&#xff0c;怎么定义的&#xff1f;基本矩阵F和本质矩阵E有什么区别&#xff1f; 问题1解答&#xff1a; 极线是通过极线几何学…