【12.29】转行小白历险记-刷算法05

242.有效的字母异位词

数组、set、map,数组是比较高效查找的

函数功能

判断字符串 st 是否互为字母异位词。如果它们包含相同的字符且每个字符出现的次数也相同,那么它们互为字母异位词。

代码逻辑

  1. 长度检查

    if (s.length !== t.length) return false;

    如果 s t 的长度不相等,它们不可能是字母异位词,直接返回 false

  2. 初始化计数器数组

    const resSet = new Array(26).fill(0); 
    const base = "a".charCodeAt();
    • resSet 是一个长度为 26 的数组,用于存储每个小写字母的出现次数(假设 st 只包含小写字母)。
    • base 存储了字母 'a' 的 ASCII 码值,用于将字母转换为数组索引。
  3. 统计 s 中字符出现次数

    for (const i of s) { resSet[i.charCodeAt() - base]++; }

    遍历字符串 s使用 charCodeAt() 函数获取每个字符的 ASCII 码值,然后根据 base 计算出索引,增加 resSet 中相应位置的计数。

  4. 验证 t 中的字符

    for (const i of t) 
    { if (!resSet[i.charCodeAt() - base]) return false; 
    resSet[i.charCodeAt() - base]--; }
    • 遍历字符串 t,对于每个字符,检查 resSet 中对应位置的计数。如果计数为 0,则表示 t 中有一个在 s 中不存在的字符,或者字符出现次数不匹配,返回 false
    • 减少 resSet 中相应位置的计数。
  5. 返回结果

    return true;

    果代码执行到这里,说明 st 是字母异位词,返回 true

总结

这个函数通过计数每个字符的出现次数,来判断两个字符串是否互为字母异位词。由于只用了一个固定长度的数组,它在处理只包含小写字母的字符串时非常高效。

49字母异位词

示例 1: 输入 ["eat", "tea", "tan", "ate", "nat", "bat"]

  1. 初始化哈希表

    • 创建一个空的 Map 对象 map
  2. 遍历字符串数组

    • 对于每个字符串 str 在数组 ["eat", "tea", "tan", "ate", "nat", "bat"] 中,执行以下步骤:

      • "eat"

        • 分解、排序并重新组合:"eat" -> ["e", "a", "t"] -> ["a", "e", "t"] -> "aet"
        • map.has("aet") 返回 false(因为 "aet" 还不在 map 中),所以执行 map.set("aet", []) 并添加 "eat" 到 "aet" 键对应的数组中。
      • "tea"

        • 同样地,"tea" 排序后变为 "aet"
        • map.has("aet") 返回 true(因为 "aet" 已存在),所以直接将 "tea" 添加到 "aet" 键对应的数组中。
      • "tan"

        • "tan" 排序后变为 "ant"
        • map.has("ant") 返回 false,所以执行 map.set("ant", []) 并添加 "tan" 到 "ant" 键对应的数组中。
      • "ate"

        • "ate" 排序后也是 "aet"
        • 再次将 "ate" 添加到 "aet" 键对应的数组中。
      • "nat"

        • "nat" 排序后变为 "ant"
        • 将 "nat" 添加到 "ant" 键对应的数组中。
      • "bat"

        • "bat" 排序后变为 "abt"
        • map.has("abt") 返回 false,所以执行 map.set("abt", []) 并添加 "bat" 到 "abt" 键对应的数组中。
  3. 提取并返回结果

    • 使用 Array.from(map.values())map 中的所有值(即分组后的字符串数组)转换为一个数组。
    • 返回的数组是:[["eat", "tea", "ate"], ["tan", "nat"], ["bat"]]

结果解释

函数 groupAnagrams 将每个字符串按字母排序后,使用排序结果作为键来分组所有字母异位词。最终返回的数组包含了分组好的字母异位词数组,每个子数组包含所有字符集相同的原始字符串。在这个例子中,"eat"、"tea" 和 "ate" 互为字母异位词,因此它们被分组在一起,同理可得其他分组。

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

  1. 初始化两个计数器数组pCountsCount 分别用于存储 p 和窗口内字符串的字符计数。

  2. 遍历 p:对 p 中的每个字符进行计数。

  3. 滑动窗口:遍历字符串 s,同时更新 sCount 数组来计算窗口内各字符的出现次数。

  4. 窗口大小与 p 相等时:比较 sCountpCount。如果两者完全一致,将左指针的位置加入结果数组。

  5. 移动窗口:右指针每向右移动一次,左指针也相应地向右移动一次,以保持窗口大小不变。

这种方法通过在 s 上滑动一个固定大小的窗口并比较字符出现次数,有效地找出了所有 p 的异位词的起始索引。

 

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

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

相关文章

【华为机试】2023年真题B卷(python)-计算最大乘积

一、题目 题目描述: 给定一个元素类型为小写字符串的数组,请计算两个没有相同字符的元素长度乘积的最大值,如果没有符合条件的两个元素,返回0。 二、输入输出 输入描述: 输入为一个半角逗号分隔的小写字符串的数组,2 &…

数字PID算法基础

数字PID是由编程语言实现的PID算法并烧录到控制芯片中,控制芯片与电机驱动连接,将PID控制算法的输出转换为PWM控制信号发送给电机驱动电路,电机驱动电路与直流电机相连并将PWM控制信号转换为具有相同占空比的PWM供电电压,通过对输…

Jmeter之从CSV文件获取数据

新建csv文件 新建一个excel,填充业务数据,然后导出csv格式文件。 添加一个CSV数据文件 使用

认识K8S的基本概念和原理

K8S:Kubernetes8个字母省略就是k8s 自动部署,自动扩展和容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群。是一个功能强大的容器编排工具。分布式和集群化的方式进行容器管理。 k8s的版本:1.15或1.18。使…

RO-NeRF论文笔记

RO-NeRF论文笔记 文章目录 RO-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Method3.1 RGB and depth inpainting network3.2 Background on NeRFs3.3 Confidence-based view selection3.4 Implementation details 4 Experiments4.1 DatasetsReal ObjectsSynthe…

YOLOv5算法进阶改进(9)— 引入ASPP | 空洞空间金字塔池化

前言:Hello大家好,我是小哥谈。ASPP是空洞空间金字塔池化(Atrous Spatial Pyramid Pooling)的缩写。它是一种用于图像语义分割任务的特征提取方法。ASPP通过在不同尺度上进行空洞卷积操作,从而捕捉到图像中不同尺度的上下文信息。ASPP的主要思想是在输入特征图上应用多个不…

【QT】单例模式,Q_GLOBAL_STATIC 宏的使用和使用静态成员函数,eg:{简单的日志记录器}

简单的日志记录器为例 。 创建一个Logger类,该类负责记录应用程序的日志消息 使用 Q_GLOBAL_STATIC 宏 解析:Q_GLOBAL_STATIC 是一个 Qt 宏,用于创建全局静态实例。它确保在需要时只创建一次实例,而不管该实例是在哪个线程中创建…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具,标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP:192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…

Mybatis 传参的方式

第一种情形,传入单个参数 userId service层: Override public User getUserInfo(Integer userId) {User user userMapper.getUserInfo(userId);//省略 业务代码...return user; } mapper层: User getUserInfo(Integer userId); mapper.x…

浅层神经网络时间序列预测和建模

目录 时间序列网络 NARX 网络 NAR 网络 非线性输入-输出网络 定义问题 使用神经网络时间序列拟合时间序列数据 使用命令行函数拟合时间序列数据 选择数据 选择训练算法 创建网络 准备要训练的数据 划分数据 训练网络 测试网络 查看网络 分析结果 闭环网络 向…

第七课:计算机网络、互联网及万维网(WWW)

第七课:计算机网络、互联网及万维网(WWW) 第二十八章:计算机网络1、局域网 Local Area Networks - LAN2、媒体访问控制地址 Media Access Control address - MAC3、载波侦听多路访问 Carrier Sense Multiple Access - CSMA4、指数…

BFC(解决高度塌陷的问题)

BFC(解决高度塌陷的问题) 高度塌陷:子元素设置了浮动,父元素的高度随之x 元素开启BFC元素之后的特点: 1.开启BFC的元素不会被浮动的元素所覆盖。 2.开启BFC的父元素和子元素的外边距不会重叠 3.开启BFC的元素可以…

LeetCode 面试题 01.06. 字符串压缩(443. 压缩字符串)

对于算法题,按题型类别刷题才会更有成效,因此我这里在网上搜索并参考了下 “🔥 LeetCode 热题 HOT 100” 的题型归类,并在其基础上做了一定的完善,希望能够记录自己的刷题历程,有所收获!点击下发…

Stable Diffusion 系列教程 - 5 ControlNet

ControlNet和LORA的定位都是对大模型做微调的额外网络。作为入门SD的最后一块拼图是必须要去了解和开发的。为什么ControlNet的影响力如此的大?在它之前,基于扩散模型的AIGC是非常难以控制的,扩散整张图像的过程充满了随机性。这种随机性并不…

激光 GPS 卫星实现无边界精度

GPS 卫星领域已经发生了重大创新,将变得更加精确和强大。我们正在谈论激光后向反射器阵列( LRA)的发展。 这些可以精确跟踪地球的形状、自转和环境变化,从而扩展卫星的能力。 GPS卫星的主要用途是确定各种情况下的位置&#xff…

C++继承与派生——(7)类型兼容原则

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 站在巨人的肩上,是为了超过…

Unity检测地面坡度丨人物上坡检测

Unity检测地面坡度 前言使用 代码 前言 此功能为,人物在爬坡等功能时可以检测地面坡度从而完成向某个方向给力或者完成其他操作 使用 其中我们创建了脚本GradeCalculation,把脚本挂载到人物上即可,或者有其他的使用方式,可自行…

nodejs+vue+ElementUi摄影预约服务网站系统91f0v

本系统提供给管理员对首页,个人中心,用户管理,员工管理,摄影套餐管理,套餐系列管理,客片欣赏管理,摄影预约管理,摄影订单管理,取片通知管理,摄影评价管理&…

oj习题8577 合并顺序表

8577 合并顺序表 若线性表中数据元素相互之间可以比较,且数据元素在表中按值递增或递减,则称该表为有序表。 编写算法,将两个非递减有序顺序表A和B合并成一个新的非递减有序顺序表C。 输入格式 第一行:顺序表A的元素个数 第二行&…

Linux 服务器安全策略技巧:实施网络入侵防御系统

引言 在当今数字化时代,网络安全对于任何企业和个人都至关重要。特别是对于使用Linux服务器的用户来说,实施网络入侵防御系统是确保服务器安全的关键一步。本文将介绍一些Linux服务器安全策略技巧,帮助您保护服务器免受网络入侵的威胁。 1. 更新操作系统和软件 保持操作系…