代码训练LeetCode(4)字母异位词

代码训练(4)LeetCode之字母异位词

Author: Once Day Date: 2024年3月6日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 242. 有效的字母异位词 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(4)LeetCode之字母异位词
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

**注意:**若 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

例如对于carraw,就不是字母异位词,因为cw没有对上。

2. 分析

该问题是一个简单的编程题目,用C语言来实现,只要要求性能较高(速度90%),一般不浪费内存即可。

题目要求我们编写一个函数,这个函数需要判断两个字符串 st 是否是字母异位词。如果一个字符串的字母重新排列后能够得到另一个字符串,那么这两个字符串互为字母异位词。换句话说,两个字符串有相同的字母和相同数量的每个字母。

解决这个问题,核心思路是检查两个字符串中每个字母的数量是否完全相同。

  1. 哈希表法:我们可以使用一个哈希表(或称为字典)来记录字符串 s 中每个字符出现的次数,然后遍历字符串 t,减少哈希表中对应字符的计数。如果最后哈希表中所有字符的计数都是零,则说明 ts 的字母异位词。
  2. 数组法:由于题目只提到了字母,我们可以假设输入是 ASCII 字符串,因此可以使用一个大小为 26 的整数数组来代替哈希表。数组的每个位置对应一个字母,值为该字母在字符串 s 中出现的次数。这种方法在空间上更加高效,因为它不需要额外的哈希表结构。
  3. 排序法:将两个字符串分别排序,如果它们相等,则它们是字母异位词。

如果题目支持大量字符(比如宽字符unicode字符),那么Hash方法更合适。

这里只考虑26个字母,使用数组法解决效率更高,如下:

  1. 如果 st 的长度不同,则它们不能是字母异位词,返回 false
  2. 创建一个大小为 26 的整数数组来存储每个字母的频率。
  3. 遍历字符串 s,对于每个字符 c,在数组中 c - 'a' 的位置增加 1。
  4. 遍历字符串 t,对于每个字符 c,在数组中 c - 'a' 的位置减少 1。
  5. 遍历整数数组,如果所有位置的值都是 0,则返回 true;否则,返回 false

假设我们有两个字符串 s = "anagram"t = "nagaram"

  1. 两个字符串长度相同,继续。
  2. 创建频率数组 freq[26]
  3. 遍历 s,更新频率数组:freq['a' - 'a'] = 3, freq['n' - 'a'] = 1, 等等。
  4. 遍历 t,更新频率数组:每个对应字符的频率减 1。
  5. 最后检查频率数组,所有值都是 0,所以 ts 的字母异位词。

性能优化关键点

  • 执行速度:直接使用长度为 26 的数组来存储每个字母频率是相当快的操作,因为数组的访问时间是常数时间。

  • 内存使用:使用静态大小的数组,而不是动态数据结构如哈希表,可以减少内存开销。

3. 代码实现
bool isAnagram(char* s, char* t) {int16_t s1[26] = {0};while (*s != '\0') {s1[*s - 'a']++;s++;}while (*t != '\0') {if (--s1[*t - 'a'] < 0) {return false;}t++;}for (int i = 0; i < 26; i++) {if (s1[i]) {return false;}}return true;
}

这段代码定义了一个函数 isAnagram,它用来检测两个输入的字符串 st 是否为字母异位词。字母异位词是指由相同的字母以不同的顺序组成的单词或短语。

函数的工作原理如下:

  1. 定义并初始化一个整型数组 s1 用于计数26个英文字母在字符串 s 中出现的次数。数组的每个索引对应一个字母(0索引对应 ‘a’,1索引对应 ‘b’,以此类推)。
  2. 第一个 while 循环遍历字符串 s,通过递增 s1 数组相应的计数器来记录每个字母出现的次数。
  3. 第二个 while 循环遍历字符串 t,同时递减 s1 数组中相应字母的计数器。如果某个字母的计数器在递减前已经是0或在递减后变为负数,这意味着字符串 t 中这个字母出现的次数多于字符串 s 中的次数,或者字符串 s 中没有这个字母,因此可以判断两个字符串不是字母异位词,函数返回 false
  4. 第三个 for 循环检查 s1 数组中的计数器是否都回到了0。如果有任何计数器的值不为0,这意味着字符串 s 中有字母没有在字符串 t 中出现相同的次数,或字符串 t 较短而未能消除 s 中的某些字母计数,因此两个字符串也不是字母异位词,函数同样返回 false
  5. 如果所有的计数器最终都是0,这意味着两个字符串有相同的字母和相同的字母出现次数,函数返回 true,表示字符串 st 是字母异位词。

运行截图如下所示,可以看到运行效率和内存使用还是非常好的,这里有个注意点,C语言strlen函数开销很大,不能频繁调用,这和Python等动态语言是完全不同的。

在这里插入图片描述

在这里插入图片描述

4. 总结

这个题目考查了对字符串的基本操作,以及对哈希表和数组数据结构的理解和应用。为了提升解决此类问题的能力,可以加强对数据结构的学习和实践,特别是了解如何根据不同的问题选择合适的数据结构来优化性能。此外,对字符串的常见操作如遍历、比较、哈希编码等的掌握也是非常关键的。

理解和应用。为了提升解决此类问题的能力,可以加强对数据结构的学习和实践,特别是了解如何根据不同的问题选择合适的数据结构来优化性能。此外,对字符串的常见操作如遍历、比较、哈希编码等的掌握也是非常关键的。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

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

相关文章

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章&#xff1a; WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么&#xff1f;为什么用它建站&#xff1f;怎么安装与部署&#xff1f; 初次安装WordPress后如何进行网站设置&#xff08;主题安装、…

分析:如何多线程运行测试用例

这是时常被问到的问题&#xff0c;尤其是UI自动化的运行&#xff0c;过程非常耗时&#xff0c;所以&#xff0c;所以多线程不失为一种首先想到的解决方案。 多线程是针对的测试用例&#xff0c;所以和selenium没有直接关系&#xff0c;我们要关心的是单元测试框架。 unittest …

安康杯安全知识竞赛上的讲话稿

各位领导、同志们&#xff1a; 经过近半个月时间的准备&#xff0c;南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕&#xff0c;经过紧张激烈的角逐&#xff0c; 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

Zookeeper基础知识:成功分布式系统的关键

文章目录 一、引言二、Zookeeper介绍三、Zookeeper安装四、Zookeeper架构【重点】4.1 Zookeeper树形结构4.2 znode类型4.3 Zookeeper的监听通知机制 五、Zookeeper常用操作5.1 zk常用命令5.2 Java连接Zookeeper5.3 Java操作Znode节点5.4 监听通知机制 六、Zookeeper集群【重点】…

Tablesgenerator 使用

1.在线工具网站 Create LaTeX tables online – TablesGenerator.com 2.按住 shift 选择边框 3.选择标题和双栏布局 4.保存和加载表格 5.默认风格与三线表 Default table style使用 \hline 而 Booktabs 使用 \toprule、\midrule和\bottomrule。 \toprule、\midrule和 \botto…

MVO-CNN-BiLSTM多输入时序预测|多元宇宙优化算法-卷积-双向长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

Paddle上手实战——NLP经典cls任务“推特文本情感13分类”

Paddle上手实战——NLP经典cls任务“推特文本情感13分类” 实战背景介绍 数据地址:https://www.heywhale.com/home/activity/detail/611cbe90ba12a0001753d1e9/content Twitter推文具备多重特性,首要之处在于其与Facebook的显著区别——其完全基于文本形式,通过Twitter接…

1分钟做的AI利润表分析报告,效果怎样?

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事&#xff01; 自从去年年初ChatGPT3.5推出以来&#xff0c;AI大模型的话题就一直非常热了。相比于AI聊天、生成图片&#xff0c;亦…

计算机组成原理之机器:存储器之主存储器

计算机组成原理之机器&#xff1a;存储器 笔记来源&#xff1a;哈尔滨工业大学计算机组成原理&#xff08;哈工大刘宏伟&#xff09; Chapter3&#xff1a;存储器 3.1 概述 存储器可分哪些类型&#xff1f; 现代存储器的层次结构&#xff0c;为什么要分层&#xff1f; …

【自然语言处理】NLP入门(五):1、正则表达式与Python中的实现(5):字符串常用方法:对齐方式、大小写转换详解

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出4.字符转义符5. 字符串常用函数函数与方法之比较 6. 字符串常用方法1. 对齐方式center()ljust()rjust() 2. 大小写转换lower()upper()capitalize()title()swapcase() 一、前言 本…

不买后悔!腾讯云99元一年服务器链接,折合8元1个月

腾讯云服务器99元一年是真的吗&#xff1f;真的&#xff0c;99元优惠购买入口 txybk.com/go/99 折合每天8元1个月&#xff0c;腾讯云99元服务器配置为2核2G3M带宽&#xff0c;2024年99元服务器配置最新报价为61元一年&#xff0c;如下图&#xff1a; 腾讯云服务器99元一年 腾讯…

【新书推荐】16.4 软中断处理程序举例

本节内容&#xff1a;打印I/O源程序和时钟显示程序。 ■打印I/O源程序&#xff1a;t16-6.asm。 ■时钟显示程序&#xff1a;t16-7.asm。 16.4.1 打印I/O源程序 我们以打印I/O程序的源程序&#xff0c;作为BIOS中断处理程序设计的例子。每个打印机有三个寄存器&#xff1a;数据…