leetcode438. 找到字符串中所有字母异位词(java)

滑动窗口

  • 找到字符串中所有字母异位词
    • 滑动窗口
    • 数组优化
  • 上期经典

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

难度 - 中等
Leetcode 438 - 找到字符串中所有字母异位词

给定两个字符串 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” 的异位词。

提示:
1 <= s.length, p.length <= 3 * 1e4
s 和 p 仅包含小写字母

在这里插入图片描述

滑动窗口

这个所谓的字母异位词,不就是排列吗,相当于,输入一个串 S,一个串 T,找到 S 中所有 T 的排列,返回它们的起始索引。

因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。

构造滑动窗口时,我们用双指针,右指针代表扩大窗口,左指针代表缩小窗口,在扩大和缩小窗口时,我们把满足条件的字符加入到对比的hash 表中,

代码演示:

 /*** 异位* @param s* @param p* @return*/public List<Integer> findAnagrams(String s, String p) {HashMap<Character, Integer> need = new HashMap<>();HashMap<Character, Integer> wind = new HashMap<>();//将目标值加进来for (char c : p.toCharArray()){need.put(c,need.getOrDefault(c,0) + 1);}int left = 0;int right = 0;int valid = 0;ArrayList<Integer> ans = new ArrayList<>();while (right < s.length()){char c = s.charAt(right);right++;if (need.containsKey(c)){wind.put(c,wind.getOrDefault(c,0) + 1);if (need.get(c).equals(wind.get(c))){valid++;}}//判断什么时候缩小窗口while (right - left >= p.length()){//满足条件时 将起始位置加进去if (valid == need.size()){ans.add(left);}char d = s.charAt(left);left++;if (need.containsKey(d)){if (wind.get(d).equals(need.get(d))){valid--;}wind.put(d,wind.get(d) - 1);}}}return ans;}

数组优化

因为 题目中说是小写字母组成的,范围就是固定的,可以利用数组来优化掉hash 表,
带来两个好处:
1.时间更快,数组的效率高于hash.
2.空间更省,数组占用空间小于hash.

代码演示:

    public List<Integer> findAnagrams(String s, String p) {ArrayList<Integer> ans = new ArrayList<>();int n = s.length();int m = p.length();if (n < m){return ans;}int[] need = new int[26];int[] wind = new int[26];//将目标值加进来for (char c : p.toCharArray()){++need[c - 'a'];}int left = 0;int right = 0;while (right < n){char c = s.charAt(right);right++;if (need[c - 'a'] != 0){++wind[c - 'a'];}//判断什么时候缩小窗口while (right - left >= m){//满足条件时 将起始位置加进去if (Arrays.equals(need,wind)){ans.add(left);}char d = s.charAt(left);left++;if (need[d - 'a'] != 0){wind[d - 'a']--;}}}return ans;}

上期经典

leetcode 567. 字符串的排列

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

软考:中级软件设计师:大数据

软考&#xff1a;中级软件设计师:大数据 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#x…

网络经济与企业管理【五】之市场营销管理

感谢内容提供者&#xff1a;金牛区吴迪软件开发工作室 上一篇&#xff1a;网络经济与企业管理【四】之企业组织管理 文章目录 第五章&#xff1a;市场营销管理一、市场营销概述二、市场营销过程1.市场营销的过程2.目标营销经历的三个阶段3.选择目标市场的三种战略4.市场营销组…

【市场营销学三】企业战略与营销管理

【市场营销学三】企业战略与营销管理 一、企业战略与规划1.1、企业战略特征1.2、企业战略层次结构1.3、企业战略规划过程 二、总体战略2.1、认识和界定企业使命2.2、区分战略业务单位2.3、明确投资组合2.4、选择业务成长战略 三、经营战略3.1、分析竞争环境3.2、选择竞争战略 四…

【市场营销学二】市场营销管理哲学及其贯彻

【市场营销学二】市场营销管理哲学及其贯彻 一、市场营销哲管理哲学及其演进1.1、 什么是市场营销管理1.2、什么是市场营销管理哲学1.3、以企业为中心的观念1.4、以消费者为中心的观念1.5、以利益相关者和社会整体利益为中心的观念 二、以全方位营销促进顾客满意及客户忠诚2.1、…

Docker容器:docker consul的注册与发现及consul-template

Docker容器&#xff1a;docker consul的注册与发现及consul-template守护进程 一.docker consul的注册与发现介绍 1.什么是服务注册与发现 &#xff08;1&#xff09;服务注册与发现是微服务架构中不可或缺的重要组件。 &#xff08;2&#xff09;为解决服务都是单节点的&a…

DiskCatalogMaker for Mac简单智能快速的磁盘管理工具

DiskCatalogMaker是一款Mac上的磁盘目录管理工具。它可以帮助用户快速创建和管理磁盘目录&#xff0c;方便查找和访问存储在磁盘上的文件和文件夹。它具有快速扫描和索引功能&#xff0c;生成详细的目录列表&#xff0c;支持关键字搜索和自定义标签。 此外&#xff0c;DiskCat…

Zotero教程

Zotero教程 简介 Zotero是一款集成式的文献管理工具&#xff0c;支持一键导出bib格式文献库或一键插入Word文档。当然&#xff0c;作为一款文献管理工具&#xff0c;它的核心功能就是文献的管理。不清楚你是否有这样的苦恼&#xff0c;看过的论文很难归类&#xff0c;有得论文…

python使用matplotlib 画柱状图代码_Python 使用 matplotlib 画柱状图教程

Python 使用 matplotlib 画图是非常方便的,之前的文章记录了《Python 使用 matplotlib 画折线图教程》,今天就再次记录一下使用 matplotlib 画柱状图的教程。一般来说,也就折线图和柱状图这两种图比较常见,所以基本上老唐也就用了这两个。 一、基本柱状图 代码:import mat…

(动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

❓剑指 Offer 48. 最长不含重复字符的子字符串 难度&#xff1a;中等 请从字符串中找出一个最长的不包含重复字符的子字符串&#xff0c;计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为…

SpringBoot 2.x 集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件

在Spring中提供了非常好用的 JavaMailSender接口实现邮件发送,在SpringBoot的Starter模块中也为此提供了自动化配置。 项目源码已托管在Gitee-SpringBoot_Guide 几个名词解释 什么是POP3、SMTP和IMAP&#xff1f; 详细介绍-请移步至网易帮助文档 IMAP和POP3有什么区别&#x…

Gmail配置邮箱客户端

公司的游戏的找回密码功能发邮件是走GMail渠道来实现的。之前在做这一部分的时候&#xff0c;受到QQ邮箱的影响&#xff0c;以为没什么大问题&#xff08;之前QQ邮箱配置过什么&#xff0c;也比较简单,简单设置好独立密码即可&#xff09;然后主要原因是这次再次经历了这个过程…

matlab 点云的二进制形状描述子

目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,

网易企业邮箱登录服务器出错,网易企业邮箱登录出现故障,无法正常登录

9月1日上午8:30左右&#xff0c;强比科技企业邮箱客服中心陆续接到网易企业邮箱用户反馈&#xff0c;在通过“mail.域名”登录邮箱过程中出现异常&#xff0c;页面出现“您所请求的网址(URL)无法获取”等错误提示&#xff0c;导致无法正常登录邮箱。 随后&#xff0c;客服人员进…

非常难得的iPad版房地产售楼助手应用

一款高质量的iPad房地产售楼助手应用&#xff0c;采用的是类似facebook&#xff0c;新浪微博&#xff0c;腾讯微博&#xff0c;人人网的布局视图。功能有&#xff1a;客户管理系统&#xff08;可添加&#xff0c;编辑等&#xff09;&#xff1b;2.房源管理系统;3.房贷计算器等&…

新IPAD安装程序

新IPAD安装程序 安装爱思助手iPad连接电脑复制UDID生成两个签名文件ipa签名安装制作好的ipa下拉设置服务器IP 安装爱思助手 https://www.i4.cn/ iPad连接电脑 复制UDID 生成两个签名文件 把复制的UDID发给研发或IT部&#xff0c;拿到生成的两个签名文件 ipa签名 安装制作…

linux并发服务器 —— Makefile与GDB调试(二)

Makefile Makefile&#xff1a;定义规则指定文件的编译顺序&#xff1b;类似shell脚本&#xff0c;执行操作系统命令 优点&#xff1a;自动化编译——通过make&#xff08;解释Makefile文件中指令的命令&#xff09;命令完全编译整个工程&#xff0c;提高软件开发效率&#x…

Windows下MATLAB调用Python函数操作说明

MATLAB与Python版本的兼容 具体可参看MATLAB与Python版本的兼容 操作说明 操作说明请参看下面两个链接&#xff1a; 操作指南 简单说明&#xff1a; 我安装的是MATLAB2022a和Python3.8.6&#xff08;安装时请勾选所有可以勾选的&#xff0c;包括路径&#xff09;。对应版本安…

Go测试之.golden 文件

Go测试中的.golden 文件是干什么用的&#xff1f;请举例说明 在Go语言中&#xff0c;.golden文件通常用于测试中的黄金文件&#xff08;golden files&#xff09;。黄金文件是在测试期间记录预期输出结果的文件。测试用例运行时&#xff0c;黄金文件用于比较实际输出与预期输出…

【js案例】滚动效果实现及简单动画函数抽离

目录 &#x1f31f;效果 &#x1f31f;实现思路 &#x1f31f;实现方法 HTML&CSS代码 初始化 滚动效果 完整JS代码 &#x1f31f;抽离动画函数 函数的简单使用 小案例一 小案例二 &#x1f31f;效果 &#x1f31f;实现思路 要实现自动滚动&#xff0c;无非就…

[转载]田雪松硬笔行书临文征明《滕王阁序》_拔剑-浆糊的传说_新浪博客

原文地址&#xff1a;田雪松硬笔行书临文征明《滕王阁序》 作者&#xff1a;游目骋怀