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://www.hqwc.cn/news/90141.html

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

相关文章

R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化

全文链接&#xff1a;https://tecdat.cn/?p33499 响应面&#xff08;Response Surface Methodology&#xff0c;RSM&#xff09;分析是一种常用的统计方法&#xff0c;用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系&#xff0c;RSM可以帮助…

PyTorch 深度学习实践 第10讲刘二大人

总结&#xff1a; 1.输入通道个数 等于 卷积核通道个数 2.卷积核个数 等于 输出通道个数 1.单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。假设卷积核大小为3x3&#xff0c…

一篇文章搞定《WebView的优化及封装》

一篇文章搞定《WebView的优化及封装》 前言WebView的过程分析确定优化方案一、预加载&#xff0c;复用缓冲池&#xff08;初始化优化&#xff09;优化的解析说明具体的实现 二、预置模版&#xff08;请求、渲染优化&#xff09;优化的解析说明具体的实现1、离线包2、预获取数据…

(笔记五)利用opencv进行图像几何转换

参考网站&#xff1a;https://docs.opencv.org/4.1.1/da/d6e/tutorial_py_geometric_transformations.html &#xff08;1&#xff09;读取原始图像和标记图像 import cv2 as cv import numpy as np from matplotlib import pyplot as pltpath r"D:\data\flower.jpg&qu…

VUE笔记(六)vue路由

一、路由的简介 1、实现生活中的路由 路由&#xff1a;路由其实就是一个key-value对应关系 路由器&#xff1a;用于管理多个路由关系的设备被称为路由器 2、前端的路由 目前使用的前端项目都是单页面的应用&#xff08;SPA&#xff09;&#xff0c;一个项目中只有一个html页…

vue-drag-resize实现拖拽,座椅摆放

插件&#xff1a; vue-drag-resize <div class"drag-resize"><!-- https://juejin.cn/post/6844903713430061063isActive 是否激活状态 Default: falsew,h 组件宽度,高度 Default: 200--><VueDragResize :isActive"true" :w"100&qu…

JavaScript基础语法01——初识JavaScript

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近有项目用到KingFusion软件&#xff0c;由于KingFusion是B/S架构的客户端组态软件&#xff0c;因此在学习KingFusion产品时会涉及许多前端的知识。 像JavaScript语言就是需要用的&#xff0c;俗话说&#xff1a;活到…

并发编程01(Lock Condition 生产者消费者)详细讲解

并发 并发编程∶并发、并行 并发&#xff08;多线程操作同一个资源) CPU一核&#xff0c;模拟出来多条线程&#xff0c;天下武功&#xff0c;唯快不破&#xff0c;快速交替并行(多个人一起行走) CPU 多核&#xff0c;多个线程可以同时执行; public class QuickSort {public …

在编辑器中使用正则

正则是一种文本处理工具&#xff0c;常见的功能有文本验证、文本提取、文本替换、文本切割等。有一些地方说的正则匹配&#xff0c;其实是包括了校验和提取两个功能。 校验常用于验证整个文本的组成是不是符合规则&#xff0c;比如密码规则校验。提取则是从大段的文本中抽取出…

使用通信顺序进程(CSP)模型的 Go 语言通道

在并发编程中&#xff0c;许多编程语言采用共享内存/状态模型。然而&#xff0c;Go 通过实现 通信顺序进程&#xff08;CSP&#xff09;模型来区别于众多。在CSP中&#xff0c;程序由不共享状态的并行进程组成&#xff1b;相反&#xff0c;它们通过通道进行通信和同步操作。因此…

知识图谱(1)知识存储与检索

目录 Neo4j在win系统安装Neo4j基础语法知识图谱创建知识图谱查询知识图谱属性增减 python与neo4j Neo4j在win系统安装 图数据库&#xff08;graph database&#xff09;是一种特殊的数据库&#xff0c;用于存储丰富的关系数据&#xff0c;neo4j是目前最流行的图数据库&#xf…

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…