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

力扣:438. 找到字符串中所有字母异位词 题解

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

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

  • 预备知识
  • 解题思路
  • 复杂度
  • Code
  • 其它细节
  • 推荐博客或题目
    • 博客
    • 题目
      • 滑动窗口
      • 哈希表

预备知识

image.png

此题用到了双指针算法中的滑动窗口思想,以及哈希表的运用。c++中是unordered_map。如果对此不了解的uu,建议查看相关介绍博客和更简单的题目!!!

解题思路

该题解法为:滑动窗口 + 哈希表。

  1. 该题的滑动窗口是固定的,我们只需要对每次移动新字符和删除字符进行判断,时间复杂度为O(n)。

  2. 首先,定义一个哈希表,记录要满足匹配p字符串需要多少的对应的字符。

    unordered_map<char, int> pp;
    
  3. 遍历p,出现对应的字符,就在该位置的–,说明还需要在s中找多少该字符。

    while (j < p.size()) {  //O(1) 理论上子字符串的操作应该是1//开始遍历,在s上初始化第一个字符串,能够满足对应字符供给的就++pp[s[j++]]++;
    }
    
  4. 遍历pp,如果不为0,说明该子字符串不满足匹配条件,则跳到x.

    for (auto& [a, b] : pp) {   //O(1) max=26//遍历pp,如果不为0,说明该子字符串不满足匹配条件,则跳到xif (b != 0) goto x;
    }
    
  5. 最后进行全局遍历

    while (j < s.size()) {  //O(n)//开始遍历//对于j位置的字符,将pp对应位置++,表示提供一个字符pp[s[j]]++;//对于i位置的字符,将pp对应位置--,表示不能提供一个字符pp[s[i]]--;for (auto& [a, b] : pp) {   //O(1) max=26if (b != 0) goto xx;}v.push_back(i + 1);xx:;i++;j++;
    }
    

复杂度

时间复杂度:

O(26 * n),26是遍历哈希表中的每种英文字母的个数,最多为26,n是遍历滑动窗口。

空间复杂度:

O(26 + n),26是哈希表最大size,n是vector最大size。

Code

class Solution {
public:vector<int> findAnagrams(string s, string p) {//记录要满足匹配p字符串需要多少的对应的字符unordered_map<char, int> pp;    vector<int> v;int i = 0, j = 0;for (auto a : p) {  //O(n)//遍历p,出现对应的字符,就在该位置的--,说明还需要多少该字符pp[a]--;}while (j < p.size()) {  //O(1) 理论上子字符串的操作应该是1//开始遍历,在s上初始化第一个字符串,能够满足对应字符供给的就++pp[s[j++]]++;}for (auto& [a, b] : pp) {   //调试bug的时候可以用输出的方法cout << a << b << endl;}for (auto& [a, b] : pp) {   //O(1) max=26//遍历pp,如果不为0,说明该子字符串不满足匹配条件,则跳到xif (b != 0) goto x;}v.push_back(i);x:;while (j < s.size()) {  //O(n)//开始遍历//对于j位置的字符,将pp对应位置++,表示提供一个字符pp[s[j]]++;//对于i位置的字符,将pp对应位置--,表示不能提供一个字符pp[s[i]]--;for (auto& [a, b] : pp) {   //O(1) max=26if (b != 0) goto xx;}v.push_back(i + 1);xx:;i++;j++;}return v;}
};

其它细节

可以尝试用输出日志的方式来获得局部代码的正确性。对于比较长的代码,我们应该在写完整个代码之前,已经完成多个地方的日志输出。多加练习能够提高自己写代码的正确性。

for (auto& [a, b] : pp) {   //调试bug的时候可以用输出的方法cout << a << b << endl;
}

推荐博客或题目

博客

  1. 滑动窗口详解
  2. 哈希表理论基础

题目

滑动窗口

  1. 无重复字符的最长子串 难度:++

哈希表

  1. 两数之和 难度:++
  2. 三数之和 难度:+++
  3. 四数之和 难度:++++
  4. 四数相和II 难度:++++

相关文章:

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…...

QT 高DPI解决方案

一、根据DPI实现动态调整控件大小&#xff08;三种方式&#xff09; 1、QT支持高DPI&#xff08;针对整个进程中所有的UI&#xff09; // main函数中 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)tips&#xff1a;&#xff08;1&#xff09;如果不想全局设置&am…...

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana虽然有一些相似之处&#xff0c;但是它们的功能和适用场景还是有所不同。 SLB主要用于将大流量的请求分配到多个服务器上进行处理&#xff0c;从而提高系统的可伸缩性和可靠性。它适用于需要处理大流量的应用&#xff0c;如…...

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…...

汽车信息安全--芯片厂、OEM安全启动汇总(1)

目录 1.芯驰E3安全启动 2.STM32 X-CUBE-SBSFU 3.小米澎湃OS安全启动 4.小结 我在前篇文章里详细记录了车规MCU信息安全设计过程关于网络安全架构的思考过程,从芯片原厂、供应商、OEM等角度思考如何建立起完备的信任链; 不过这思考过程仅仅只是一家之言,因此我又对比了国…...

气膜建筑:舒适、智能、可持续

气膜建筑之所以能够拥有广阔的发展空间&#xff0c;源于其融合了诸多优势特点&#xff0c;使其成为未来建筑领域的前沿趋势。 气膜建筑注重环境可持续性和能源效率。在材料和设计上&#xff0c;它采用可回收材料、提高热保温效果&#xff0c;并积极利用太阳能等可再生能源&…...

【C语言】一种状态超时阻塞循环查询的办法

【C语言】一种状态超时阻塞循环查询的办法 文章目录 【C语言】一种状态超时阻塞循环查询的办法1.方法12.方法21.方法1 static void wait_notify_async(notify_type_t notify_type) {static rt_tick_t exit_tick;exit_tick = rt_time_get_msec();lb_int32 notify_success = RT_F…...

【leetcode】力扣热门之回文链表【简单难度】

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 用例 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 输入&#xff1a;head [1,2] 输出&#xff1a;f…...

【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法

力扣题 1、题目地址 578. 查询回答率最高的问题 2、模拟表 SurveyLog 表&#xff1a; Column NameTypeidintactionENUMquestion_idintanswer_idintq_numinttimestampint 这张表可能包含重复项。action 是一个 ENUM(category) 数据&#xff0c;可以是 “show”、“answer”…...

Debezium发布历史49

原文地址&#xff1a; https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 使用发件箱模式进行可靠的微服务数…...

数据结构——队列(Queue)

目录 1.队列的介绍 2.队列工程 2.1 队列的定义 2.1.1 数组实现队列 2.1.2 单链表实现队列 2.2 队列的函数接口 2.2.1 队列的初始化 2.2.2 队列的数据插入&#xff08;入队&#xff09; 2.2.3 队列的数据删除&#xff08;出队&#xff09; 2.2.4 取队头数据 2.2.5 取队…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)...

WPF 使用矢量字体图标

矢量字体图标 在WPF项目中经常需要显示图标&#xff0c;但是项目改动后&#xff0c;有时候需要替换和修改图标&#xff0c;这样非常麻烦且消耗开发和美工的时间。为了快速开发项目&#xff0c;节省项目时间&#xff0c;使用图标矢量字体图标是一个非常不错的选择。 矢量字体图标…...

编程语言的语法糖,你了解多少?

什么是语法糖 语法糖是一种编程语言的特性&#xff0c;通常是一些简单的语法结构或函数调用&#xff0c;它可以通过隐藏底层的复杂性&#xff0c;并提供更高级别的抽象&#xff0c;从而使代码更加简洁、易读和易于理解&#xff0c;但它并不会改变代码的执行方式。 为什么需要语…...

MySQL中FLUSH TABLES命令语法

在MySQL中&#xff0c;FLUSH TABLES 命令的作用是刷新表。当你使用 FLUSH TABLES 命令的具体选项时&#xff08;例如 FLUSH TABLES WITH READ LOCK&#xff09;&#xff0c;该选项必须是在 FLUSH 语句中唯一指定的命令。即&#xff0c;在一个 FLUSH 语句中&#xff0c;你只能使…...

如何在小米4A刷OpenWRT系统并通过cpolar实现公网访问本地路由器

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…...

Spring学习之——事务控制

Spring中的事务控制 说明&#xff1a; JavaEE体系进行分层开发&#xff0c;事务处理位于业务层&#xff0c;Spring提供了分层设计业务层的事务处理解决方案。 Spring框架为我们提供了一组事务控制的接口。具体在后面的小节介绍。这组接口是在spring-tx.RELEASE.jar中。 spri…...

云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)

背景介绍 2023年&#xff0c;我们见证了科技领域的蓬勃发展&#xff0c;每一次技术革新都为我们带来了广阔的发展前景。作为后端开发者&#xff0c;我们深受其影响&#xff0c;不断迈向未来。 随着数字化浪潮的席卷&#xff0c;各种架构设计理念相互交汇&#xff0c;共同塑造了…...

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…...

智慧工厂:科技与制造融合创新之路

随着科技的迅猛发展&#xff0c;智慧工厂成为制造业领域的热门话题。智慧工厂利用先进的技术和智能化系统&#xff0c;以提高生产效率、降低成本、增强产品质量和灵活性为目标&#xff0c;正在引领着未来制造业的发展。 智慧工厂的核心是数字化和自动化生产&#xff0c;相较于传…...

SCADE—产品级安全关键系统的MBD开发套件

产品概述 随着新能源三电、智能驾驶等新技术的应用&#xff0c;汽车中衍生出很多安全关键零部件&#xff0c;如BMS、VCU、MCU、ADAS等&#xff0c;相应的软件在汽车中的比重越来越大&#xff0c;并且安全性、可靠性要求也越来越高。ANSYS主要针对安全关键零部件的嵌入式产品级软…...

PyTorch|保存与加载自己的模型

训练好一个模型之后&#xff0c;我们往往要对其进行保存&#xff0c;除非下次用时想再次训练一遍。 下面以一个简单的回归任务来详细讲解模型的保存和加载。 来看这样一组数据&#xff1a; xtorch.linspace(-1,1,50)xx.view(50,1)yx.pow(2)0.3*torch.rand(50).view(50,1) 画…...

javaScript:Math工具类方法

1 Math工具类方法: >和其他的类的不同&#xff0c;Math并不是一个构造函数&#xff0c;也就是无法通过new来创建Math的实例 >Math表示的数学&#xff0c;在Math对象中存储了一组数学运算相关的常量的和方法 >这些常量和方法可以直接通过Math来访问 >比如Math.P…...

ffmpeg转码新技能

ffmpeg转码新技能 mp3转wavmp4转gif mp3转wav 今天发现之前用ffmpeg转码不好使了。今天发现一个ffmpeg转码新的用法非常简单 ffmpeg -i 0104.mp3 -f wav 0104.wav mp4转gif 同学求助将mp4转gif。我先用剪影把mp4的多余黑边去除。然后用ffmpeg将mp4转出了gif ffmpeg -i shu…...

Docker学习笔记(一):Docker命令总结

Docker命令总结 一、Docker介绍1.1 镜像与容器区别 二、Docker命令 一、Docker介绍 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者在几乎任何环境中运行应用程序&#xff0c;而无需担心运行环境的问题。Docker的核心概念是容器&#xff0c;它可以将应用程序及其依赖…...

JavaWeb——后端案例

五、案例 1. 开发规范—Restful REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表述性状态转换&#xff0c;是一种软件架构风格 注&#xff1a; REST是风格&#xff0c;是约定方式&#xff0c;不是规定&#xff0c;可以打破描述模块的功能通常使…...

【CSS】浅学一下filter

目录 1、基本概念 2、用法 3、应用案例 更加智能的阴影效果&#xff1a; 元素、网页置灰 元素强调、高亮 毛玻璃效果 调整网页sepia 褐色值可以实现护眼效果 1、基本概念 CSS filter 属性将模糊或颜色偏移等图形效果&#xff08;对比度、亮度、饱和度、模糊等等&#…...

Commander One for Mac:强大的双窗格文件管理器,让你的工作效率倍增!

Commander One for Mac是一款功能强大的文件管理工具&#xff0c;具有以下主要功能&#xff1a; 双窗格设计&#xff1a;主界面分为两个窗格&#xff0c;用户可以在左侧窗格中导航和浏览文件系统的目录结构&#xff0c;在右侧窗格中查看文件和文件夹的内容。文件操作&#xff…...

leetcode09-机器人能否返回原点

题目链接&#xff1a; https://leetcode.cn/problems/robot-return-to-origin/?envTypestudy-plan-v2&envIdprogramming-skills 思路&#xff1a; 循环遍历&#xff0c;模拟即可 代码&#xff1a; class Solution {public boolean judgeCircle(String moves) {int n m…...

做网站建设怎么介绍自己/贴吧aso优化贴吧

第二题 序列求和 1.效率问题 能用乘法就不用累加&#xff0c;因为循环在输入较大的数以后会出现超时。 2.大小问题 如果输入的数很大就会容易出现盛不下的问题&#xff0c;溢出&#xff1f; 如图所示&#xff0c;在定义变量的时候&#xff0c;是long long,还有输出&#xff0c;…...

html5手机网站开发/如何推广自己成为网红

iTextSharp 对表格的操作相对 Word 来说&#xff0c;显得有些笨拙&#xff0c;似乎无法做到单元格跨行或跨列。所以若要创建这一类型的 PdfPTable tItemTable new PdfPTable(1); PdfPTable tPlanSumTable new PdfPTable(1); 表格&#xff0c;只能通过在单元格中嵌入一个表格来…...

社交网站推广怎么做/有什么平台可以推广信息

作为新时代的我们&#xff0c;手机不能仅仅只是成为追剧&#xff0c;玩游戏的工具&#xff0c;除了这些&#xff0c;我们的手机还可以用来提升自我&#xff0c;让你每天都过得很精彩&#xff0c;今天给大家推荐4个可以帮助你的手机APP&#xff0c;很适合大学生使用哦&#xff0…...

做彩票网站推广犯法吗/利搜网站排名软件

三个线程&#xff0c;怎样保证第二个在第一个执行完后执行&#xff0c;第三个在第二个执行完在执行 线程start后调用join实现&#xff0c;join相当于把并行改成串行&#xff0c;停止当前主线程 去执行join线程&#xff0c;join线程执行完后在接着直接主线程Lock接口比较synchro…...

做网站服务器电脑配置/百度竞价推广登陆

LitePal是GitHub上一款开源的Android数据库框架. 它採用了对象关系映射(ORM)的模式,将平时开发时最经常使用的一些数据库功能进行了封装。使得开发人员不用编写一行SQL语句就能够完毕各种建表、増删改查的操作。 并且LitePal非常“轻”&#xff0c;jar包大小不到100k&#xff0…...

建设网站 证件/网店运营在哪里学比较好些

鸢尾花&#xff08;adam同时结合SGDM一阶动量和RMSPro二阶动量&#xff09; # 利用鸢尾花数据集&#xff0c;实现前向传播、反向传播&#xff0c;可视化loss曲线 # adam同时结合SGDM一阶动量和RMSPro二阶动量import tensorflow as tf from sklearn import datasets from matpl…...