【图解算法】- 异位词问题:双指针+哈希表

  一 - 前言

介绍:大家好啊,我是hitzaki辰。

社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。

自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名:hitzaki辰。

正文开始,抓紧上车!


二 - 异位词问题概述

1 - 异位词是什么

1)比如 abc 和 bca就是一个异构词

2)异构词的简单判断:

(1)长度相等

(2)每个字母的数量都相等

2 - 判断异位词

对于需要比较的字符串s和t,使用哈希表可以很方便的判断异位词,维护1个count和一个哈希表

1)关键代码1解读 - 迭代s串

对字符串s的所有字符都进行哈希,此时map对应每个字符的数量,count代表字符的种类。

Map<Character, Integer> map = new HashMap<>();
int count = 0;
for(int i=0; i<p.length(); i++){Integer temp = map.get(p.charAt(i));map.put(p.charAt(i), temp==null? 1: temp+1);if(temp==null) count++;
}

比如aabc对应的map和count迭代过程为:

2)关键代码2解读 - 迭代t串:(不同的题,我们迭代的方式不同。)

获取当前t.charAt(i),

(1)若map中没有对应key,说明不是异位词

(2)若有key,将对应value-1,若减为0,则将count-1。

(3)若有key,且对应value已经等于0,说明不是异位词。

最后判断count是否为0,若为0说明是异位词。

以aaba为例:

3 - 根据题干优化

如果题干说只有小写或大写字母这种情况,即固定了出现可能的集合,则我们可以使用一个数组代替哈希表

s串每次迭代只需要这样:++count[s.charAt(i) - 'a'];

三 - 例题1:找到字符串所有字母异位词

题目索引:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

1 - 使用哈希表题解:详细注解

class Solution {public List<Integer> findAnagrams(String s, String p) {​    Map<Character, Integer> map = new HashMap<>();​    int count = 0;​    List<Integer> result = new ArrayList<>();​    for(int i=0; i<p.length(); i++){​      Integer temp = map.get(p.charAt(i));​      map.put(p.charAt(i), temp==null? 1: temp+1);​      if(temp==null) count++;​    }​    int p1=0, p2=0;​    boolean flag;​    while(p2<s.length()){​      // 迭代p2​      Integer temp2 = map.get(s.charAt(p2));​      if(temp2==null){ // 包含p2的都不可能,因此结束​        flag = false;​      }else{​        flag = true;​        map.put(s.charAt(p2), temp2-1);​        if(temp2==1)count--;​      }​      p2++;​      ​      // 迭代p1, 根据p2情况进行迭代​      // 1.若p2存在, 则当p2-p1==p.length()时才进入​      // 若p2不存在, 则迭代至p1==p2​      while(flag? p2-p1==p.length(): p1<p2-1){ // 只有p2-1时有null判断​        if(count==0)result.add(p1);​        // 将p1位置给去除​        Integer temp1 = map.get(s.charAt(p1)); ​        if(temp1==0)count++;​        map.put(s.charAt(p1), temp1+1);​        p1++;​      }​      if(!flag)p1++; // p1=p2-1时候一定为null, 跳过​    } // 主迭代结束​    return result;}}

2 - 使用数组题解:注解

class Solution {public List<Integer> findAnagrams(String s, String p) {​    int sLen = s.length(), pLen = p.length();​    if (sLen < pLen) {​      return new ArrayList<Integer>();​    }​    List<Integer> ans = new ArrayList<Integer>();​    int[] count = new int[26];​    for (int i = 0; i < pLen; ++i) {​      ++count[s.charAt(i) - 'a'];​      --count[p.charAt(i) - 'a'];​    }​    int differ = 0;​    for (int j = 0; j < 26; ++j) {​      if (count[j] != 0) {​        ++differ;​      }​    }​    if (differ == 0) {​      ans.add(0);​    }​    for (int i = 0; i < sLen - pLen; ++i) {​      if (count[s.charAt(i) - 'a'] == 1) {  // 窗口中字母 s[i] 的数量与字符串 p 中的数量从不同变得相同​        --differ;​      } else if (count[s.charAt(i) - 'a'] == 0) {  // 窗口中字母 s[i] 的数量与字符串 p 中的数量从相同变得不同​        ++differ;​      }​      --count[s.charAt(i) - 'a'];​      if (count[s.charAt(i + pLen) - 'a'] == -1) {  // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从不同变得相同​        --differ;​      } else if (count[s.charAt(i + pLen) - 'a'] == 0) {  // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从相同变得不同​        ++differ;​      }​      ++count[s.charAt(i + pLen) - 'a'];​      ​      if (differ == 0) {​        ans.add(i + 1);​      }​    }​    return ans;}}

四 - 例题2:最小覆盖子串

题目索引:https://leetcode.cn/problems/minimum-window-substring/description/

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

1 - 思路

例子:s = "ADOBECODEBANC", t = "ABC"

使用双指针

(1)左指针用来将map和count恢复

(2)右指针用来将map对应的value减一,并改变count

当count=0时,说明此时符合条件,则将此时的子串记录下来。

2 - 题解:详细注解

维护一个数量count和map, 先迭代t将map填充,然后让count = map.size

(1)p2遍历到的如果在map里就将map里对应元素-1, 如果刚好减到0就count-1

(2)如果count==0, 则开始遍历p1,

  每次让p1对应到map的元素+1, 每次迭代判断长度, 若小于min则更新

class Solution {public static String minWindow(String s, String t) {Map<Character, Integer> map = new HashMap<>();int min=Integer.MAX_VALUE, index=0,  count;Integer temp;for(int i=0; i<t.length(); i++){temp = map.get(t.charAt(i));map.put(t.charAt(i), temp==null? 1: temp+1);}count = map.size();int p1=0, p2=0;for(;p2<s.length();p2++){// 添加p2位置temp = map.get(s.charAt(p2));if(temp==null)continue;// 如果为1说明减完p2元素会归0, 则count变化map.put(s.charAt(p2), temp-1);if(temp==1) count--;// 迭代p1while(count==0){if(p2-p1+1<min) {min = p2-p1+1;index = p1;}// 去掉当前p1的元素temp = map.get(s.charAt(p1));p1++;if(temp==null)continue;map.put(s.charAt(p1-1), temp+1);if(temp==0) count++;}}if(min == Integer.MAX_VALUE)return "";return s.substring(index, index+min);}
}

五 - 结尾

感谢你看到这里,如果感觉内容不错的话请点赞支持一下!

如果小伙伴对我的讲解有疑问,欢迎评论区讨论。

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

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

相关文章

Google Chrome 任意文件读取 (CVE-2023-4357)漏洞

漏洞描述 该漏洞的存在是由于 Google Chrome 中用户提供的 XML 输入验证不足。远程攻击者可以创建特制网页&#xff0c;诱骗受害者访问该网页并获取用户系统上的敏感信息。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制&#xff0c;导致chrome任意文件读取。Li…

每日汇评:美日在两个月低点附近似乎较为脆弱,熊市可能会在FOMC会议纪要公布前暂停

美元/日元跌至两个月低点&#xff0c;并受到多种因素的压力&#xff1b; 美联储鸽派预期和美国债券收益率下降继续令美元承压&#xff1b; 美日利差缩小以及日本央行政策转变的押注提振了日元&#xff1b; 美元/日元货币对在周二持续第四天承受着沉重的卖压&#xff0c;同时也标…

京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取

京东开放平台提供了API接口来访问京东商品详情。通过这个接口&#xff0c;您可以获取到商品的详细信息&#xff0c;如商品名称、价格、库存量、描述等。 以下是使用京东商品详情API接口的一般步骤&#xff1a; 注册并获取API权限&#xff1a;您需要在京东开放平台上注册并获取…

OAK相机通过振动测试!

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 当…

为什么AirtestIDE的selenium Window突然无法检索控件了?

1. 前言 最近有很多朋友跟我们反馈&#xff0c;为什么1.2.15版本的IDE没办法做网页元素检索了&#xff0c;是不是我们不支持selenium了之类的。 测试后发现&#xff0c;目前版本确实存在这个问题&#xff0c;原因是Chrome113.0.5672.127(最新)版本过高&#xff0c;AirtestIDE…

数据库表的内连接和外连接

1.内连接查询语法 -- 隐式内链接 SELECT 字段列表 FROM 表1&#xff0c;表2WHERE 条件&#xff1b; -- 显示内连接 select 字段列表 from 表1 [inner] join 表2 on 条件&#xff1b; 如果两个表没用进行内连接&#xff0c;会生成笛卡尔积。A集合和B集合全部元素进行排列组合。 …

linux制作 ext4镜像image 脚本demo

结构如下&#xff1a; build_linux_targetfs.sh #!/bin/bashCHECK_MARK"\033[0;32m\xE2\x9C\x94\033[0m" X_MARK"\033[0;1;31mX\033[0m"export TOP_DIR$PWD export TARGET_IMAGE_PATH$TOP_DIR/filesystem/targetfs-images export BSP_IMAGE_PATH${TOP_DI…

SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

SQL NULL 值 什么是 NULL 值&#xff1f; NULL 值是指字段没有值的情况。如果表中的字段是可选的&#xff0c;那么可以插入新记录或更新记录而不向该字段添加值。此时&#xff0c;该字段将保存为 NULL 值。需要注意的是&#xff0c;NULL 值与零值或包含空格的字段不同。具有 …

JavaScript中的设计模式

目录 1.工厂模式 2.构造函数模式 构造函数中new关键字作用&#xff1a; 3.原型模式 4.组合模式 JavaScript中有四种常见的设计模式 &#xff0c;目的是为了批量创建对象 为了实现继承。 1.工厂模式 利用工厂模式批量创建对象 优点&#xff1a;可以批量创建对象 …

html滑动文章标题置顶

position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如&#xff1a;AAA组件&#xff08;注意&#xff0c;只能有一层盒子&#xff0c;不能在外面继续包一层div&#xff09; <template><div class"box">{{title}}</div> </templa…

酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?

过去两年酒店行业加速洗牌&#xff0c;“强者恒强”的马太效应正持续凸显。 报告显示&#xff0c;2022年排名前10名的酒店集团分别为锦江国际、华住、首旅如家、格林、东呈集团、尚美数智、亚朵、德胧、逸柏、都市酒店。以上10家酒店集团客房规模在连锁酒店市场占有率为62.36&…

【EI会议征稿】第四届公共管理与智能社会国际学术会议(PMIS 2024)

第四届公共管理与智能社会国际学术会议&#xff08;PMIS 2024) 2024 4th International Conference on Public Management and Intelligent Society 第四届公共管理与智能社会国际学术会议将在2024年3月15-17日在长沙召开。PMIS 2024由中南大学社会计算研究中心、中南大学公共…

根据nginx日志统计页面访问次数

静态页面部署在nginx上&#xff0c;页面只有查看下载功能。 需求是统计每条访问次数和下载次数&#xff0c;根据日志分析写了一个shell脚本&#xff0c;触发脚本后生成一个html可以远程查看统计的数量。 #!/bin/bash # nginx日志文件路径 LOG_FILE"/usr/local/nginx/l…

注册亚马逊美国买家号需要些什么资料?

注册亚马逊美国买家号需要准备邮箱、美国手机号、美国地址及能支付的支付卡。准备好之后进入亚马逊美国站进行点击注册&#xff0c;按照格式填写好之后即可注册成功了。 而如果想要注册大量买家号&#xff0c;可以使用亚马逊鲲鹏系统进行自动化操作&#xff0c;想要自动化更顺畅…

活动回顾 | 数字外贸私享会【上海站】成功举办

11月17日&#xff0c;由箱讯科技主办的数字外贸高端定制私享会【上海站】成功举办&#xff01;本次会议的主题为“新模式、新商机、新政策”&#xff0c;外贸行业的老板、企业家们齐聚一堂&#xff0c;凝聚共识&#xff0c;共话数字外贸的新趋势和新机遇。 近年来&#xff0c;数…

HTML+CSS+ElementUI搭建个人博客页面(纯前端)

网站演示 搭建过程 html部分 首先下载Vue2&#xff0c;ElementUI等插件&#xff0c;放在你的本地。我这里为了运行方便&#xff0c;把代码放在了一个框架里运行。 下载后引入部分 <link rel"stylesheet" href"{{URL::asset(elementui/lib/theme-chalk/ind…

bank conflicts 理解

1、同一个bank下如果有多个threads access 不同的地址&#xff0c;就会出现bank conflicts, 2、如果是多个threads read 同一个bank内的同一个地址&#xff0c;就是broadcast 模式没有bank conflicts&#xff0c;这种情况下带宽利用率较低&#xff0c;因为只用了一个bank资源…

黑马React18: 基础Part II

黑马React: 基础2 Date: November 16, 2023 Sum: 受控表单绑定、获取DOM、组件通信、useEffect、Hook、优化B站评论 受控表单绑定 受控表单绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 准备一个React状态值 const [value, se…

基于C#实现协同推荐 SlopeOne 算法

一、概念 相信大家对如下的 Category 都很熟悉&#xff0c;很多网站都有类似如下的功能&#xff0c;“商品推荐”,"猜你喜欢“&#xff0c;在实体店中我们有导购来为我们服务&#xff0c;在网络上我们需要同样的一种替代物&#xff0c;如果简简单单的在数据库里面去捞&am…

小迪笔记(1)——操作系统文件下载反弹SHELL防火墙绕过

名词解释 POC&#xff1a;验证漏洞存在的代码&#xff1b; EXP&#xff1a;利用漏洞的代码&#xff1b; payload&#xff1a;漏洞利用载荷&#xff0c; shellcode&#xff1a;漏洞代码&#xff0c; webshell&#xff1a;特指网站后门&#xff1b; 木马&#xff1a;强调控制…