当前位置: 首页 > news >正文

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

题目

链接:leetcode链接
在这里插入图片描述

思路分析(滑动窗口)

很容易想到,这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。

OK,先思考一下怎么快速判断两个字符串是否是异位词?
比较简单的方法是,把字符串的每一个字符往哈希表里面丢,然后比较哈希表即可。
异位词只关心字母的个数,不关心顺序,所以使用哈希表可以比较快速的判断。
记p为hash1,s为hash2

然后,我们只需要去维护一个定长的窗口,去与p去比较即可。

OK,
那么先left,right = 0;
然后进窗口,hash2[right]++
当窗口的长度大于p的长度时,开始出窗口
hash2[left]–,left++;

当hash1 == hash2 时,就left即满足要求。

优化

注意,这里hash表里面仅仅存的是字符,总共26个小写字母,直接遍历一遍出结果就可以,还是很好比较的,但是,如果存的不是字符呢?存的是字符串怎么办?
这是再遍历hash去比较,比较的麻烦。
这里提出一种可以优化的方案。

大体思路不变,主要是优化hash表的比较。

我们增加一个变量count,来记录窗口中的有效元素的个数。
我们在进窗口后和出窗口前都去维护这个count变量即可。

那么什么是有效元素呢?
我们来举一个例子,就以示例1为例
s = “ccaebabacd” , p = “abc”
开始 hash2[s[right]] 进入hash表后,1 <= hash1[c],那么这就是有效元素,count++
right++;
hash2[s[right]]进入hash表后,2 > hash1[c] ,这就是无效元素,count就不变

接着a入窗口,有效元素,count++,
接着e如窗口,无效元素,count不变

这时发现窗口长度超过了p的长度,就需要出窗口,
出窗口前,发现hash2[left] == 2 > hash1[left],那么说明出的这个元素是无效元素,count不需要改变
下一次出窗口时,发现hash2[c] <= hash1[c],诶,就是有效元素了,count–

当count == 3时,left就是符合要求的下标。

代码

优化前代码

 vector<int> findAnagrams(string s, string p) {int hash1[26] = {0},hash2[26] = {0};int len = p.size();vector<int> v;for(auto e:p) {hash1[e-'a']++;}for(int left = 0,right = 0;right < s.size();++right){char in = s[right];hash2[in - 'a']++;if(right - left + 1 > len){char out = s[left];hash2[out - 'a']--;left++;}int i = 0;for( i = 0;i<26;i++){if(hash1[i]!=hash2[i])break;}if( i == 26)v.push_back(left);}return v;}

优化后代码

vector<int> findAnagrams(string s, string p) {int hash1[26] = {0},hash2[26] = {0};int len = p.size();int count = 0;vector<int> v;for(auto e:p) {hash1[e-'a']++;}for(int left = 0,right = 0;right < s.size();++right){char in = s[right];hash2[in - 'a']++;if(hash2[in - 'a'] <= hash1[in - 'a']){count++;}if(right - left + 1 > len){char out = s[left];if(hash2[out - 'a'] <= hash1[out - 'a']) count--;hash2[out - 'a']--;left++;}if(count == len)v.push_back(left);}return v;}

相关文章:

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

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 很容易想到&#xff0c;这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。 OK&#xff0c;先思考一下怎么快速判断两个字符串是否是异位词&#xff1f; 比较简单的方法是…...

Microsoft SC-100: Microsoft 网络安全架构师

SC-100认证介绍 Microsoft SC-100: Microsoft 网络安全架构师是微软网络安全方向的相关证书&#xff0c; 作为 Microsoft 网络安全架构师&#xff0c;你要将网络安全策略转化为保护组织的资产、业务和运营的功能。 你要设计、指导实现和维护遵循零信任原则和最佳做法的安全性解…...

代码随想录训练营day42|188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV 变成了最多可以买卖k只股票 class Solution { public:int maxProfit(int k, vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2*k1,0));for(int i1;i<2*k1;i2){dp[0][i]-prices[0];}//初始…...

解决Pynput不能在Ubuntu22.04上正常使用问题

pynput 是一个 Python 库&#xff0c;它提供了一套简单的接口来控制和监控输入设备&#xff0c;包括鼠标和键盘。这个库允许开发者编写跨平台的代码来处理输入事件&#xff0c;无需担心底层操作系统的差异。 下面是pynput的测试程序&#xff1a; from pynput.keyboard import …...

IPV4端口数据有哪些?

关于IPv4的端口数据包括端口号&#xff0c;协议类型&#xff0c;端口状态&#xff0c;扫描时间以及开放时间&#xff0c;这些是常见的实时IPv4端口扫描和分析数据。 IPv4端口号 Ipv4端口号是一个16位的无符号整数&#xff0c;范围从0到65535&#xff0c;这些端口号用于区分运…...

【爱加密_云平台-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

Open CASCADE学习|按圆离散旋转体

旋转体是一个非常重要的概念&#xff0c;它涉及到三维空间中由二维曲线绕某一轴线旋转形成的立体形状。这种旋转体的形成过程&#xff0c;实际上是一个连续变化的动态过程&#xff0c;但在数学和几何学中&#xff0c;我们往往通过静态的方式来描述和研究它。 旋转体的基本特性…...

无人矿车使用ZMQ消息代理进行跨机互联进行消息收发

目录 背景 前景知识 1.启动一个代理服务器 2.发布者 3.订阅者 实际应用 1.模拟智驾收来自交互箱131的按钮json数据 2.模拟交互箱131收来自智驾137的cjson数据 背景 在调试防爆无轨无人矿车时&#xff0c;出现消息代理不能很好转发&#xff0c;于是在公司通过代理的方式…...

医疗机构关于DIP/DRG信息化建设

推进DIP/DRG支付方式改革是一项系统性工程&#xff0c;牵一发而动全身。作为河北省DIP试点医院&#xff0c;河北医科大学第二医院将信息化与创新性管理理念融合&#xff0c;用好支付工具做好精细化管理&#xff0c;积极应对改革。 ■ 改革背景 国家医疗保障局制定的《DRG/DIP支…...

100个候选人,没一个能讲明白什么是自动化框架?

什么是自动化测试框架 01 什么是框架 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法。它规定了应用的体系结构&#xff0c;阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程&#xff0c;表现为一组抽象类以及其实例之间…...

数据结构与算法1: 链表

题目名称&#xff1a; 重排链表 链接&#xff1a; ​​​​​​. - 力扣&#xff08;LeetCode&#xff09; 介绍&#xff1a;本题的目标是将链表进行重新组合&#xff0c;如下图。 如果按照标准的解法&#xff0c;我们需要实现三步 1. 链表中点的获取 2. 链表的反转 3. 链…...

【专题】2024年8月医药行业报告合集汇总PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37621 在科技飞速发展的当今时代&#xff0c;医药行业作为关乎人类生命健康的重要领域&#xff0c;正处于前所未有的变革浪潮之中。数智医疗服务的崛起&#xff0c;为医疗模式带来了全新的转变&#xff0c;开启了医疗服务的新时代。…...

这10种人不适合干项目经理,你在其中吗?

在一个项目中&#xff0c;项目经理扮演着至关重要的角色&#xff0c;他们需要协调各种资源、管理团队、制定计划以及应对各种挑战。然而&#xff0c;并非每个人都适合担任项目经理的角色。以下他们天生不适合当项目经理&#xff0c;你会在其中找到自己的类型吗&#xff1f; 1、…...

IT每日英语(三)

系列文章目录 IT每日英语&#xff08;二&#xff09; 文章目录 系列文章目录前言1.collie2.century3.farewell4.meme5.hall6.needle7.simulate8.emulate9.arbitray10.laboratory11.jest12.suite13.approach14.satellite15.instance16.representation 前言 这里给出的是本人在…...

【保姆级教程】如何创建一个vitepress项目?

文章目录 安装前的准备工作项目安装创建文件初始化文件安装依赖遇到了 missing peer deps 警告&#xff1f;命令行设置向导 完成 安装前的准备工作 Node.js 18 及以上版本。通过命令行界面 (CLI) 访问 VitePress 的终端。支持 Markdown 语法的编辑器。推荐 VSCode 及其官方 Vu…...

智能头盔语音识别声控芯片,AI离线语音识别ic方案,NRK3301

头盔是交通事故中保护电动车车主安全的最后一道屏障。为了增加骑行用户的安全保护&#xff0c;改善骑行用户的出行体验&#xff0c;让用户从被动使用头盔到主动佩戴头盔&#xff0c;头盔厂家与九芯电子合作&#xff0c;推出了语音智能头盔&#xff0c;它具备首家骑行专用的智能…...

【STM32】CAN总线基础入门

CAN总线基础入门 一、CAN简介二、主流通信协议对比三、CAN物理层1、CAN硬件电路2、CAN电平标准3、CAN收发器 – TJA1050&#xff08;高速CAN&#xff09;4、CAN物理层特性 四、帧格式1、CAN总线帧格式2、数据帧&#xff13;、数据帧各部分用途简介&#xff14;、数据帧的发展历…...

STM32F1+HAL库+FreeTOTS学习10——任务相关API函数使用

STM32F1HAL库FreeTOTS学习10——任务相关API函数使用 任务相关API函数1. uxTaskPriorityGet()2. vTaskPrioritySet()3. uxTaskGetNumberOfTasks()4. uxTaskGetSystemState()5. vTaskGetInfo()6. xTaskGetCurrentHandle()7. xTaskGetHandle()8. xTaskGetIdleTaskHandle()9. uxTa…...

华为 HCIP-Datacom H12-821 题库 (14)

有需要题库的可以加下方Q群 V群进行学习交流 1.以下哪一种工具可用于多种路由协议&#xff0c;并且是由 if-match 和appl y 子句组成的&#xff1f; A、community-filter B、as-path-filter C、route-policy D、ip-prefix 答案&#xff1a;C 解析&#xff1a; 暂无解析…...

java八股!2

IO流 好短 就三个问题&#xff08;io流&#xff0c;区别&#xff0c;NIO实现&#xff09; 文章目录 IO流io流基本认识字节流和字符流的区别(中文&#xff0c;底层设备&#xff0c;缓冲区&#xff0c;应用场景&#xff09;I/O模型&#xff08;4种&#xff08;可以看做3种&…...

一分钟了解统一软件开发过程RUP的那点事

曾经几乎一统天下的统一软件开发过程RUP&#xff08;Rational Unified Process&#xff09;即使是现在看来&#xff0c;它也是一套非常先进并完整的理论体系加工具集合。虽然目前来看&#xff0c;敏捷开发方法似乎更优秀&#xff0c;但是到今天为止&#xff0c;几乎大部分的政府…...

Goby 漏洞发布|(CVE-2024-45195)Apache OFBiz /viewdatafile 代码执行漏洞【已复现】

漏洞名称&#xff1a;Apache OFBiz /viewdatafile 代码执行漏洞&#xff08;CVE-2024-45195&#xff09; English Name&#xff1a;Apache OFBiz /viewdatafile Code Execution Vulnerability(CVE-2024-45195) CVSS core: 8.0 漏洞描述&#xff1a; Apache OFBiz是一个开源…...

js的书写位置和css的书写位置的区别?为什么要这样写?

JavaScript 和 CSS 的书写位置有以下区别&#xff1a; CSS 通常写在 <style> 标签中&#xff0c;或者在外部样式表文件中&#xff08;<link rel"stylesheet" href"styles.css">&#xff09;。CSS 主要用于控制页面的视觉样式和布局&#xff0c…...

Python一些可能用的到的函数系列132 ORM-sqlalchemy连clickhouse

说明 继续ORM的转换 通过ORM&#xff0c;可以&#xff1a; 1 用几乎一样的方式来操作不同的数据库2 可以提供One的处理模式 内容 同步方式 这种方式更简单&#xff0c;适合处理小批量任务。这种操作严格来说&#xff0c;不是严格的One&#xff0c;而是MiniBatch&#xff0c…...

华为 HCIP-Datacom H12-821 题库 (12)

有需要题库的可以看主页置顶 V群进行学习交流 1.设备使能 BGP 自动聚合功能后&#xff0c;可将 10.1.1.1/24 和 10.2.1.1/24路由聚合成以下哪一项&#xff1f; A、10.2.1.0/24 B、10.0.0.0/14 C、10.0.0.0/8 D、10.1.1.0/24 答案&#xff1a;C 解析&#xff1a; 暂无解析 2.关…...

pointpillar部署-TensorRT实现(三)

模型后处理 __global__ void postprocess_kernal(const float *cls_input,float *box_input,const float *dir_cls_input,float *anchors,float *anchor_bottom_heights,float *bndbox_output,int *object_counter,const float min_x_range,const float max_x_range,const flo…...

Java学习中,为什么会混淆类方法和实例方法,应该怎么办?

在Java学习过程中&#xff0c;初学者经常会混淆类方法&#xff08;静态方法&#xff09;和实例方法。这种混淆源于它们之间的概念和使用方式具有一定的相似性&#xff0c;但却在本质上存在较大的区别。理解并掌握两者的区别和应用场景&#xff0c;是掌握Java面向对象编程思想的…...

【人工智能学习笔记】4_3 深度学习基础之循环神经网络

循环神经网络(Recurrent Neural Network, RNN) 是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network),循环神经网络具有短期记忆能力 RNN核心思想 RNN的结构 一个典型…...

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴&#xff0c;随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈&#xff0c;还是在情感世界里迷失方向&#xff0c;亦或是对个人成长感到迷茫&#xff0c;它都能倾听您的心声&#xff0c;并给…...

Android Radio2.0——公告监听设置(四)

上一篇文章我们介绍了广播公告的注册及监听设置,这里我们来看一下广播公告添加监听的调用流程。 一、添加公告监听 1、RadioManager 源码位置:/frameworks/base/core/java/android/hardware/radio/RadioManager.java /*** 添加新的公告侦听器* @param enabledAnnouncemen…...