0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

判断两个字符串中的字母是否一致

算法与数据结构 来源:吴师兄学算法 作者:吴师兄学算法 2022-08-05 11:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是吴师兄

今天的题目来源于 LeetCode 第 242 号问题:有效的字母异位词,难度为「简单」。

一、题目描述

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

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

示例 1:

输入:s="anagram",t="nagaram"
输出:true

示例 2:

输入:s="rat",t="car"
输出:false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st仅包含小写字母

进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

二、题目解析

题目讲的是让你判断两个字符串中的字母是否一致,比如示例1中,s包含字母a、n、g、r、m,而t中也包含a、n、g、r、m,都是只有这五个字母,并且频次相同,只是顺序不同。

看到频次这个词,你脑海中第一想法是什么?

没错,就是哈希表

解法思路很简单。

1、首先先判断两个字符串长度是否相同,不相同直接返回false

2、然后把s中所有的字符出现个数使用计数器统计起来,存入一个大小为 26 的数组中(注意题目的说明)

2bfac0ea-1471-11ed-ba43-dac502259ad0.png

3、最后再来统计t字符串,即遍历t时将对应的字母频次进行减少,如果期间 计数器出现小于零的情况,则说明t中包含一个不存在于s中的字母,直接返回false

2c1f3bbe-1471-11ed-ba43-dac502259ad0.png

4、最后检查计数器是否归零。

三、参考代码

1、Java 代码

//登录AlgoMooc官网获取更多算法图解
//https://www.algomooc.com
//作者:程序员吴师兄
//代码有看不懂的地方一定要私聊咨询吴师兄呀
//有效的字母异位词(LeetCode 242):https://leetcode.cn/problems/valid-anagram/
classSolution{
publicbooleanisAnagram(Strings,Stringt){

//如果两个字符串的长度都不一致,那么肯定是无法成为字母异位词的
if(s.length()!=t.length()){

//直接返回false
returnfalse;

}

//让a-z这26个字母对应的下标变成0-25方便存到数组中
//比如a对应的索引就是0
//b对应的索引就是1
int[]table=newint[26];

//从头到尾遍历字符串s
for(inti=0;i< s.length() ; i++){

            //把访问的字符转换为整数的形式
//比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
intindex=s.charAt(i)-'a';

//那么意味着这个字母出现的频次需要加1
table[index]++;

}

for(inti=0;i< t.length() ; i++){

            //把访问的字符转换为整数的形式
//比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
intindex=t.charAt(i)-'a';

//那么意味着这个字母出现的频次需要减1
table[index]--;

//如果说发现这个字母出现的频次小于了0
//说明t中出现了s中不曾用的字母
if(table[index]< 0){

//那就不是字母异位词
returnfalse;

}

}

//否则,说明是字母异位词
returntrue;

}
}

2、C++ 代码

classSolution{
public:
boolisAnagram(strings,stringt){
//如果两个字符串的长度都不一致,那么肯定是无法成为字母异位词的
if(s.length()!=t.length()){

//直接返回false
returnfalse;

}

//让a-z这26个字母对应的下标变成0-25方便存到数组中
//比如a对应的索引就是0
//b对应的索引就是1
vector<int>table(26,0);

//从头到尾遍历字符串s
for(inti=0;i< s.length() ; i++){

            //把访问的字符转换为整数的形式
//比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
intindex=s[i]-'a';

//那么意味着这个字母出现的频次需要加1
table[index]++;

}

for(inti=0;i< t.length() ; i++){

            //把访问的字符转换为整数的形式
//比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
intindex=t[i]-'a';

//那么意味着这个字母出现的频次需要减1
table[index]--;

//如果说发现这个字母出现的频次小于了0
//说明t中出现了s中不曾用的字母
if(table[index]< 0){

//那就不是字母异位词
returnfalse;

}

}

//否则,说明是字母异位词
returntrue;
}
};

3、Python 代码

classSolution:
defisAnagram(self,s:str,t:str)->bool:

#如果两个字符串的长度都不一致,那么肯定是无法成为字母异位词的
iflen(s)!=len(t):
#直接返回False
returnFalse

#让a-z这26个字母对应的下标变成0-25方便存到数组中
#比如a对应的索引就是0
#b对应的索引就是1
table=[0]*26

#从头到尾遍历字符串s
foriins:

#把访问的字符转换为整数的形式
#比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
index=ord(i)-ord('a')

#那么意味着这个字母出现的频次需要加1
table[index]+=1


foriint:

#把访问的字符转换为整数的形式
#比如访问字母a,那么-'a'之后就是0,就是a对应的索引为0
index=ord(i)-ord('a')

#那么意味着这个字母出现的频次需要减1
table[index]-=1

#如果说发现这个字母出现的频次小于了0
#说明t中出现了s中不曾用的字母
iftable[index]< 0:

#那就不是字母异位词
returnFalse


#否则,说明是字母异位词
returnTrue

四、复杂度分析

  • 时间复杂度:O(n),其中 n 为 s 的长度。
  • 空间复杂度:O(S)),其中 S 为字符集大小,此处 S = 26 。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计数器
    +关注

    关注

    32

    文章

    2306

    浏览量

    97598
  • 字母
    +关注

    关注

    0

    文章

    2

    浏览量

    7211
  • 字符串
    +关注

    关注

    1

    文章

    594

    浏览量

    23046

原文标题:LeetCode 242:有效的字母异位词

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-标准IO接口之格式化输入

    字符,格式说明符除外(%):任何不是空格字符(空白、换行符或制表符)或格式说明符(以%字符开头)的字符都会导致函数从流读取下
    发表于 11-12 08:35

    labview如何生成个带字符串返回的dll

    labview如何生成个dll,如下图,要求个输入,类型是字符串,返回类型也是字符串
    发表于 08-28 23:20

    在Python字符串逆序有几种方式,代码是什么

    对于个给定的字符串,逆序输出,这个任务对于python来说是种很简单的操作,毕竟强大的列表和字符串处理的些列函数足以应付这些问题 了,
    的头像 发表于 08-28 14:44 790次阅读

    harmony-utils之StrUtil,字符串工具类

    harmony-utils之StrUtil,字符串工具类 harmony-utils 简介与说明 [harmony-utils] 款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 11:32 381次阅读

    请问STM32MP135 I2C MemAddress最多两个字节吗?

    MP135的I2C底层读写函数里面对于MemAddress做了限制, 最多两个字节的MemAddress, 这是MP135的硬件限制 还是 单纯的在功能的实现上做了限制? 我现在对接的设备 他必须要三字节的MemAddress,怎么办呢
    发表于 03-14 08:23

    求助,关于STM32口Bootloader的两个问题求解

    串口Bootloader两个问题: 1.APP和Bootloader对于串口的初始化以及中断处理函数的定义是否需要保持一致,特别是有关接收和发送的缓冲区? 2.Bootloader
    发表于 03-12 07:17

    AFE0064是否设计上和DDC232芯片一致

    integrator),如下图所示,其积分器有两个开关,可以在路进行AD转换的同时,另外路在对外部信号进行采样,这样可以实现无中断的采样。 现在我想请教您下AFE0064这颗芯
    发表于 01-17 06:31

    字符串在数据库的存储方式

    数据库是现代信息技术存储和管理数据的核心组件。字符串作为最常见的数据类型之,在数据库的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度
    的头像 发表于 01-07 15:41 1261次阅读

    字符串在编程的应用实例

    字符串在编程中有着广泛的应用,它们被用于表示文本数据、处理用户输入、构建动态内容等。以下是字符串在编程的应用实例: 1. 用户输入与输出 用户输入 :程序通常需要从用户那里获取输
    的头像 发表于 01-07 15:33 1144次阅读

    字符串字符数组的区别

    在编程语言中,字符串字符数组是种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示
    的头像 发表于 01-07 15:29 1696次阅读

    字符串反转的实现方式

    在编程字符串反转是个基础而重要的操作,它涉及到将一个字符串字符顺序颠倒过来。这个操作在
    的头像 发表于 01-07 15:27 1255次阅读

    字符串处理方法 字符串转数字的实现

    在编程,将字符串转换为数字是个常见的需求。不同的编程语言有不同的方法来实现这功能。以下是些常见编程语言中的
    的头像 发表于 01-07 15:26 1413次阅读

    C语言笔试题

    。 函数 g 输出一个字符串,返回整数 2。 主函数中用 printf 输出两个函数的函数值,后面的参数个是函数 f,个是函数 g。 运行程序应该会有三行输出,
    的头像 发表于 12-30 09:48 678次阅读

    HarmonyOS Next 应用元服务开发-应用接续动态配置跨段迁移

    取值必须保持一致,示例如下: 说明,continueType在本应用要保证唯字符串字母、数字和下划线组成,最大长度127
    发表于 12-25 10:10

    用ads1158在读取数据的时候,后面两个字节的数据读不到,为什么?

    我现在用的ads1158在读取数据的时候,通道号是可以正常读取的,但是后面两个字节的数据读不到,不管输入信号怎么变化,读到的两个字节数据始终是个固定值不变。这是为什么??
    发表于 12-24 06:16