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

题目链接

题目:

分析:

  • 要找的是在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

为什么在进窗口后判断是否更改有效数据的个数?

因为进窗口之后, 才会更新hash2中的值, 更新后再判断此时的值是否小于等于hash1中的值, 此时如果小于等于的话, 才说明这个字符是有效的

为什么在出窗口前判断是否更改有效数据的个数?

因为进窗口之前, 还没有更新hash2中的值, 判断此时的值是否小于等于hash1中的值, 如果此时小于等于的话, 说明这个字符是有效的, 如果出窗口就会失去一个有效字符, 所以要在出窗口前判断是否更改有效数据的个数, 如果在出窗口后判断, hash2中的值已经被更改, 无法知道这个字符是否是有效的

代码:

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.hqwc.cn/news/700003.html

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

相关文章

牛客网Java实战项目--仿牛客网社区的学习笔记

仿牛客网社区的学习笔记 1. 项目环境搭建1.1 开发社区首页 2.开发社区登录模块2.1 发送邮件2.2 开发注册功能2.3 会话管理2.4 生成验证码2.5 开发登录、退出功能2.6 显示登录信息 4 Redis实现点赞关注4.1 Spring整合Redis访问Redis的方法&#xff1a; 4.2 Redis实现点赞4.2.1 点…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 &#xff08;1&#xff09;爬虫文件创建&#xff08;2&#xff09;检查网址是否正确&#xff08;3&#xff09;检查反爬&#xff08;3.1&#xff09; 简写输出语句&#xff0c;检查是否反爬&#xff08;3.2&#x…

TCP的滑动窗口机制和流量控制

目录 滑动窗口 流量控制 拥塞控制 滑动窗口 TCP除了保证可靠性之外&#xff0c;也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程&#xff1a; 可以看到&#xff0c;主机A这边每次收到一个ACK才发送下一个数据。这…

NSS【web】刷题

[SWPUCTF 2021 新生赛]jicao 类型&#xff1a;PHP、代码审计、RCE 主要知识点&#xff1a;json_decode()函数 json_decode()&#xff1a;对JSON字符串解码&#xff0c;转换为php变量 用法&#xff1a; <?php $json {"ctf":"web","question"…

【瑞萨RA6M3】2. UART 实验

https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…

使用java.io库序列化Java对象

在我们使用诸如Redis这类缓存系统时&#xff0c;我们往往会存在如下需求&#xff1a;将Java对象保存到Redis缓存中&#xff0c;然后在其他机器上还原回来。 Json方案 我们可以引入Json库等方式&#xff0c;将Java对象序列化为Json字符串来实现这个目的&#xff0c;但是这样的…

iOS——runtime

什么是runtime 我们都知道&#xff0c;将源代码转换为可执行的程序&#xff0c;通常要经过三个步骤&#xff1a;编译、链接、运行。 C 语言 作为一门静态类语言&#xff0c;在编译阶段就已经确定了所有变量的数据类型&#xff0c;同时也确定好了要调用的函数&#xff0c;以及函…

mysql主从热备部署

1、主从复制原理 mysql之间数据复制的基础是二进制日志文件。一台mysql数据库一旦开启用日志文件后&#xff0c;其作为master&#xff0c;它的数据库所有操作都会以事件的方式记录在二进制日志中&#xff0c;其他数据库作为slave通过一个I/O线程与主数据库保持通信&#xff0c;…

OpenAI 发布新款大型语言模型 GPT-4o,带大家了解最新ChatGPT动态。

OpenAI 发布新款大型语言模型 GPT-4o 昨日OpenAI 举办了一场线上活动&#xff0c;正式发布了其最新研发的 AI 模型 GPT-4o&#xff0c;并详细介绍了该模型的强大功能和未来发展规划。此次发布标志着 AI 技术的重大突破&#xff0c;为用户提供了更加便捷、高效的 AI 工具&#…

MySQL创建索引报错 Specified key was too long;max key length is 1000 bytes.

MySQL对创建索引的大小有限制&#xff0c;一般索引键最大长度总和不能超过1000个字节。 问题描述 MySQL创建索引时报错 Specified key was too long;max key length is 1000 bytes. 解决办法 (1) 修改存储引擎 InnoDB的索引字段长度限制大于MyISAM&#xff0c;可以尝试改成…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…