找到字符串中所有的字母异位词 ---- 滑动窗口

news2025/1/22 9:25:57

题目链接

题目:

分析:

  • 要找的是在s中和p是异位词的子串, 也就是说子串大小和p相同, 那么就是窗口大小固定的滑动窗口问题
  • 可以使用哈希数组来记录每个元素出现的个数, 定义hash1存放p中的各元素个数
  • 定义left = 0; right = 0;
  • 进窗口 让right指向的元素进窗口, 即更新hash2中的元素即个数
  • 判断 判断窗口大小是否小于等于p的长度
  • 出窗口 如果窗口大小大于p的长度, 则出窗口, 此时不需要循环出窗口, 因为窗口大小是固定的, left只需向前移动一步即可
  • 更新结果 如果此时hash2和hash1相等 说明此子串和p是异位词, 返回此时left

思考:

想要判断hash1和hash2相等, 需要分别遍历两个数组, 虽然这道题中元素都是小写字母, 时间复杂度不高, 但如果元素变复杂, 则很难比较相同, 如果我们可以用另一种方式:

  • 定义一个count = 0, 来记录窗口中"有效数据"的个数, 有效数据是指此数据是p中的元素且此元素在窗口中的个数小于等于p中的个数
  • 当进窗口时, 如果此时right指向的元素在hash2中的个数小于在hash1中的个数, 说明此时是有效数据, 则count++
  • 当出窗口时,如果此时left指向的元素在hash2中的个数小于在hash1中的个数,说明此时是有效数据, 则count--
  • 更新结果时,只需要判断此时count的大小和p的大小是否相等, 如果相等, 则返回left

代码:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        char[] ss = s.toCharArray();//为了方便转化成字符数组
        char[] pp = p.toCharArray();
        int[] hash1 = new int[26];
        for(char x:pp){
            hash1[x - 'a']++;
        }
        int[] hash2 = new int[26];
        int left = 0;
        int right = 0;
        int count = 0;
        while(right<ss.length){
            char in = ss[right];
            hash2[in-'a']++;
            if(hash2[in-'a'] <= hash1[in-'a']) count++;
            if(right-left+1>pp.length){
                char out = ss[left];
                if(hash2[out-'a'] <= hash1[out-'a']) count--;
                hash2[out-'a']--;
                left++;
            }
             if(count == pp.length){
                    list.add(left);
                }
            right++;
        }
        return list;

    }
}

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

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

相关文章

基于若依的ruoyi-nbcio流程管理系统支持指定接收人的流程审批

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

【SRC实战】无限获取优惠码

挖个洞先 https://mp.weixin.qq.com/s/HgMK4S8275VvFVbnSp6Qsw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 “ 获取优惠码有次数限制的情况下&#xff0c;如何绕过&#xff1f;” 1、新用户专属福利&#xff0c;免费领100元优惠…

Can not add resource (com.android.aaptcompiler.ParsedResource@a980fbb) to table

具体原因 资源合并时出现编译问题。 1. 什么是资源&#xff1f; 就是res目录下面的values目录下的文件。以及&#xff01;以及&#xff01;你所引入的其他依赖&#xff08;第三方库&#xff09;的values.xml文件 2. 一般什么原因会导致合并出错? 你的资源文件中的内容错误&…

python批量为图片做灰度处理

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结

攻防世界(CTF)~web-supersqli(详细解题思路)

题目介绍 题目描述“随便注” 先看一下是否存在注入 判断闭合方式 输入1’ and 11-- -正常回显 输入1and 12-- -无回显,确认是单引号闭合 看一下列数 输入1 order by 2-- - 有回显 输入1 order by 3-- - 报错&#xff0c;由此判断两列 使用union联合注入发现select被过滤了&a…

ChatGPT4o免费体验?OpenAI 又在深夜放大招了!

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、GPT4o是什么&#xff1f;二、官网…

美港通正规股票杠杆交易突破3900点,欧线集运再创历史新高

查查配5月13日,欧线集运主连高开高走,盘中一度涨超13%,截至早盘收盘涨11.93%,突破3900点。4月以来,欧线集运主连累计涨超110%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 以上代码中…

网上跳蚤市场|基于SSM+vue的网上跳蚤市场系统的设计与实现(源码+数据库+文档)

网上跳蚤市场系统 目录 基于SSM&#xff0b;vue的网上跳蚤市场系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能 5.2.2会员功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

HFSS学习-day5-边界条件

边界条件 概述边界条件类型1、理想导体边界条件&#xff08;Perfect E&#xff09;2、理想磁边界条件&#xff08;Perfect H&#xff09;3、有限导体边界条件&#xff08;Finite Conductivity&#xff09;4、辐射边界条件&#xff08;Radiation&#xff09;5、对称边界条件&…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;模拟代码 &#xff08;3&#xff09;运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中&#xff0c;使用到了com.google.common.collect依赖包&#xff0c;通过这个依赖包中提供的…

记录接口请求偶发504 Gateway Time-out问题

项目场景&#xff1a; 我们将服务部署到A公司服务器中&#xff0c;使用了共五台服务器&#xff0c;分别是&#xff1a;1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器&#xff0c;然后再转发请求到我们的ng…

【操作系统期末速成】​操作系统概述(定义|功能|特征)|发展阶段和分类|结构设计|概念补充

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

springboot306基于Java的民宿管理系统(源码+包运行+配套LW+技术指导)

项目描述 临近学期结束&#xff0c;开始毕业设计制作&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉的困难吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Java的民宿管理…

红黑树!!

文章目录 1.红黑树的概念2.红黑树的几种情况2.1 情况一&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红(p为parent&#xff0c;g为grandfather&#xff0c;u为uncle)2.2 情况二&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff…

论:即时战略RTS游戏的小地图采用 自下而上的汇报式 还是 自上而下的查找式?

关键词&#xff1a;RTS 小地图 游戏设计 思路 卫星 位置映射 阵营 更新 汇报 询问 UE4 UE5 Unreal Engine 前言 你是否想过类似红色警戒的战略小地图的要素是采用何种方式更新数据的。大量数据实时更新&#xff0c;考虑频率&#xff0c;运行效率&#xff0c;开发中如何选型&a…

EXECL小技巧

一、批量给某列添加单引号或者双引号 如下&#xff1a;D2列为需要添加引号的列&#xff0c;效果如下图 1.双引号 """"&D2&"""" 2.双引号后增加逗号 """"&D2&""""&&quo…

Android 高德地图 添加 天地图 卫星瓦片图片(解决高德地图部分地区放大后无卫星图片问题)

废话不多说&#xff0c;直接商代吗 高德地图的加载就不多说了&#xff0c;这个直接去高德官网看就行了 高德官网&#xff1a;概述-Android 地图SDK | 高德地图API 下面我们就说如何添加天地图瓦片图层 天地图官网&#xff1a;天地图API 1.先去天地图注册成为开发者 2.创建…

【C++】深度解析:用 C++ 模拟实现 String 类,探索其底层实现细节

目录 了解string类 string的内存管理 VS下string的结构 ​g下string的结构 string的模拟实现 string的构造函数 浅拷贝 深拷贝 string的遍历 重载 [] 下标访问 迭代器访问 reserve resize 增删查改 push_back() append和 insert和erase find substr swap 流插入…

java sql中 大于 小于 大于等于 小于等于 代替符号

在写java时sql会经常会忘记大于小于号的表示方法导致无法运行&#xff0c;总结一下 第一种方法&#xff1a; < &#xff1a;< < &#xff1a; < &#xff1a;> &#xff1a; > sql如下&#xff1a; create_at > #{startTime} and create_at < #{end…