「优选算法刷题」:找到字符串中所有字母异位词

一、题目

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

二、思路解析

这道题的关键在于,想到利用一个 变量 count 来记录窗口中的 「有效字符」 个数。

而有效数字存在的前提,就是 s 中每一个字符的出现次数,一定不能超过 p 中对应符的出现次数,否则就不是题目要求的子串了。

这道题我用了 2 个数组,来记录 s 和 p 中每个字符的出现次数,其中数组下标为字符的 ACII 码值

剩下的就是滑动窗口的实现跟维护、 count 的维护,以及结果的更新了,具体步骤我也有在下面代码注释中写到啦。

三、完整代码

class Solution {public List<Integer> findAnagrams(String ss, String pp) {char[] s = ss.toCharArray();char[] p = pp.toCharArray();int n = s.length;int m = p.length;List<Integer> ret = new ArrayList<Integer>();//记录 p 中每个字符的出现次数,其中数组下标为字符的 ACII 码值int[] hash1 = new int [26];for(char ch : p){hash1[ch - 'a']++;}//滑动窗口int[] hash2 = new int [26];for(int left = 0 , right = 0 , count = 0; right < n ; right ++){char in = s[right];//count 用于记录有效字符「即 s 字符串中的 a 字符数量 <= p 字符串中的 a 字符数量」if(++hash2[in - 'a'] <= hash1[in - 'a']){count ++;}//进入窗口 + 维护 countif(right - left + 1 > m){char out = s[left++];if(hash2[out - 'a']-- <= hash1[out - 'a'] ){count --;}}//出窗口 + 维护 count//更新结果if(count == m){ret.add(left);}}return ret;}
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

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

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

相关文章

LeetCode刷题——55. 跳跃游戏(HOT100)

✊✊✊&#x1f308;大家好&#xff01;本篇文章将较详细介绍贪心相关的题目55. 跳跃游戏&#xff0c;提供两种解法。代码语言为&#xff1a;C代码&#x1f607;。 &#x1f3a1;导航小助手&#x1f3a1; 55. 跳跃游戏&#x1f512;1、题目&#xff1a;☀️2、解法一&#xff1…

Win10 打开文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样

环境: Win10 专业版 加密客户端环境 问题描述: Win10 打开桌面word文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样,只有蓝色圈变大没有鼠标指针出现圈卡着不会动,和那些有鼠标箭头加小蓝色圈不一样 解决方案: 某网上查看的,还是要自己排查…

linux 更新镜像源

打开终端&#xff0c;备份一下旧的 源 文件&#xff0c;以防万一 cd /etc/apt/ ls sudo cp sources.list sources.list.bak ls然后打开清华大学开源软件镜像站 搜索一下你的linux发行版本&#xff0c;我这里是ubuntu发行版本 点击这个上面图中的问号 查看一下自己的版本号&a…

MySQL复合查询解析

&#x1f388;行百里者半九十&#x1f388; &#x1f388;目录&#x1f388; 概念多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询在from中使用子查询合并查询unionunion all 总结 概念 之前我们很多的查询都只是对于单表进行查询&#xff0c…

飞书修改不了名称?飞书如何修改名称,修改昵称

飞书如何修改名称 点击编辑信息 在这里修改姓名就可以啦

Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解数独

46 全排列 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 排列问题与组合问题的不同之处就在于&#xff0c;没有startIndex&#xff0c;同时需要设置一个used数组…

Linux———netstat命令总结详解(狠狠爱住)

netstat 命令&#xff1a; 是一个常用的网络工具&#xff0c;在 Linux 系统中用于查看网络连接、路由表、网络接口统计信息等。通过 netstat 命令&#xff0c;你可以获取当前系统中网络相关的各种信息。 基本语法&#xff1a; netstat [OPTIONS] 其中 OPTIONS 是选项&#…

tp6框架中Http类 请求的header、body参数传参 及post、file格式

引入Http类&#xff1a; 在需要使用的地方引入Http类&#xff1a; use think\facade\Http; GET请求示例&#xff1a;$response Http::get(https://example.com/api/resource); 设置Header参数&#xff1a; $headers [ Authorization > Bearer YourAccessToken, Conte…

什么是站群服务器?

网站群服务器是管理多个网站的强大工具&#xff0c;可以帮助站长轻松管理和维护多个网站&#xff0c;提高网站运营效率。在本文中&#xff0c;我们将讨论站点组服务器的优势&#xff0c;以及为什么它是网站管理员不可或缺的工具。 介绍站群服务器 网站群服务器是一个集中管理…

Ant Design Vue上传多个图片

模板代码&#xff1a; 定义变量&#xff1a; 文件限制的函数&#xff1a; 上传的函数&#xff1a; 样式函数&#xff1a; 完整代码&#xff1a; <template><div class"dialog-upload" v-if"showUploadDialog"><div class"dialog-uplo…

【PIE-Engine 数据资源】全球 10 米土地覆盖产品 (ESA-2020)

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球 10 米土地覆盖产品 (ESA-2020)时间范围2020年空间范围全球数据来源ESA WorldCover project 2020代码片段var imagespie. ImageCollection (“ESA/WORLD_COVER_2020”) 二、描述 全球 10 米土…

【知识---c++中chrono头文件中的含有的有关时间的函数】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言auto start std::chrono::system_clock::now();auto end std::chrono::system_clock::now();std::chrono::duration_cast<std::chrono::milliseconds>(…

nvm, node.js, npm, yarn 安装配置

文章目录 nvm 安装node.js 安装npm yarn 配置 nvm 安装 nvm 是一个 node.js 管理工具&#xff0c;可以快捷下载安装使用多个版本的node.js linux 命令行输入&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashwget -qO- https…

主机自动重启或自动关机故障

公司有两台品牌机&#xff0c;使用约1年半&#xff0c;最近频繁出现自动重启或自动关机现象。 排除插线板、电源线等电源的问题&#xff0c;拆机查看。 故障后的主机拆开后&#xff0c;先摸了一下散热片&#xff0c;并不烫手。 仔细查看内部&#xff0c;排线规整&#xff0c…

base64编码与图片之间相互转换

题记&#xff1a; Base64是网络上最常见的用于传输8Bit字节码的编码方式之一 1、将base64转换成图片 <img src"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0 DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg&quo…

白码ERP实现销售订单自动生成生产订单功能

某ERP项目中&#xff0c;业务员创建销售单后&#xff0c;还需要确认产品库存是否充足&#xff0c;如不充足&#xff0c;还需要手动创建生成订单通知车间进行生产&#xff0c;比较麻烦&#xff0c;客户希望系统可以自动进行判断&#xff0c;自动根据现有库存生成生产订单。 目标…

Pyside6入门教学——编写一个UI界面并显示

1、安装Pyside6 输入下列命令安装Pyside6。 pip install Pyside6 2、设计UI 打开Qt设计工具&#xff08;在安装Pyside6包的目录下&#xff09;。 【注】我这用的是anaconda虚拟环境&#xff0c;所以我的路径是D:\App\Anaconda3\envs\snake\Lib\site-packages\PySide6。设计…

三使用Docker Hub管理镜像

使用Docker Hub管理镜像 Docker Hub是Docker官方维护的Docker Registry&#xff0c;上面存放着很多优秀的镜像。不仅如此&#xff0c;Docker Hub还提供认证、工作组结构、工作流工具、构建触发器等工具来简化我们的工作。 前文已经讲过&#xff0c;我们可使用docker search 命…

124 二叉搜索树的后序遍历序列

问题描述&#xff1a;输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后续遍历结果。 递归方式求解&#xff1a;对于后续遍历而言&#xff0c;其顺序是左子节点->右子节点->根节点&#xff0c;而根据二叉搜索树的特点&#xff0c;左子树比根节点小&#xf…

freemaker导出

一、创建ftl模板文件 1、将xls文件转换为xml格式 需要将xml中内容格式化一下&#xff0c; 在线 XML 格式化 | 菜鸟工具 (jyshare.com) 将格式化好的内容&#xff0c;保存在 ftl 文件中&#xff0c;放入项目文件。 二、后端对数据做组装 Java代码中对导出文件做赋值 Override…