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

    文章

    2256

    浏览量

    94567
  • 字母
    +关注

    关注

    0

    文章

    2

    浏览量

    7147
  • 字符串
    +关注

    关注

    1

    文章

    579

    浏览量

    20515

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

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

收藏 人收藏

    评论

    相关推荐

    ASCII码在编程的应用实例

    的应用实例: 1. 字符串处理 在编程,ASCII码常用于字符串的处理。例如,可以使用ASCII码来比较两个字符的大小关系,或者通过将字符
    的头像 发表于 11-10 09:43 403次阅读

    MATLAB(5)--字符串处理

    两个字符串里的每个字符依次按ASCII值大小逐个进行比较,比较的结果是个数值向量,向量的元素为1或者0。 字符串比较函数用于
    发表于 09-06 10:22

    labview字符串数组转化为数值数组

    常重要的。LabVIEW支持多种数据类型,包括数值、字符串、数组、簇等。在本例,我们将关注字符串数组和数值数组。 字符串数组 :由系列
    的头像 发表于 09-04 17:47 2342次阅读

    labview字符串如何转换为16进制字符串

    在LabVIEW,将字符串转换为16进制字符串个常见的需求,尤其是在处理数据通信和硬件接口时。LabVIEW提供了多种方法来实现这
    的头像 发表于 09-04 15:54 2476次阅读

    labview如何实现字符串换行

    1. 字符串换行的基本概念 在LabVIEW字符串换行通常指的是在字符串插入换行符,使得字符串
    的头像 发表于 09-04 15:47 1695次阅读

    labview如何实现字符串选择输出

    在LabVIEW实现字符串选择输出是项常见的任务,它涉及到字符串处理、条件判断和用户界面设计等多个方面。由于LabVIEW是
    的头像 发表于 09-04 15:44 937次阅读

    labview中常用的字符串函数有哪些?

    ) : 功能:该函数用于返回字符串所包含的字符个数。 应用场景:常用于需要计算字符串长度的场景,如文件命名、数据处理等。 连接字符串(String Concatenate) : 功能:
    的头像 发表于 09-04 15:43 722次阅读

    labview字符串的四种表示各有什么特点

    。在LabVIEW字符串种基本的数据类型,用于表示文本信息。字符串在LabVIEW中有多种表示方式,每种方式都有其特定的应用场景和特点。以下是对LabVIEW
    的头像 发表于 09-04 15:40 580次阅读

    使用CIPDOMAIN命令时,解析长度为64个字符或更大的DNS名称失败了,为什么?

    s3.dualstack.us-east-1.amazonaws.com 将字符串减少到 63 个字符有效(-ca57 已替换为 -ca1) AT+CIPDOMAIN=\"
    发表于 07-11 07:59

    FX3在安卓系统上显示为\"DDC\",有什么办法可以定义这个字符串吗?

    正如标题所说,当我将 FX3 插入安卓设备时,安卓会询问应用程序是否可以访问\"DDC\" 。 有什么办法可以定义这个字符串吗? 谢谢!
    发表于 07-03 08:15

    如何提取串口接收字符串数组里的某个字符串

    条(有时候二十多条不定)响应字符串指令,我是用一个字符串数组来接收这些返回来的指令的。我现在只需要读取数组里的某条指令,应该怎么把它提取出来啊??有哪位前辈懂的,希望能提供点帮助。我找了好久找到
    发表于 04-22 06:05

    深入解析西门子博途文本块接口的结构与功能

    STRING 和 WSTRING 数据类型存储一个字符串的多个字符。允许在字符串中使用任何 ASCII码类型的字符。这些
    发表于 04-11 11:23 1223次阅读
    深入解析西门子博途文本块接口的结构与功能

    C语言字符串编译函数介绍

    在C语言中,字符串实际上是使用null字符O'终止的字符数组。因此,个以null结尾的
    的头像 发表于 03-07 16:18 514次阅读
    C语言<b class='flag-5'>字符串</b>编译函数介绍

    PSOC Creator 4.4是否些设置可以阻止strtok操作?

    (“空字符串!”); [i]返回 1; [i]} [i]而(代币){ [i]//打印代币 [i]看跌期权(代币); [i]//再次解析同一个字符串 [i]代币 = strtok(空
    发表于 01-24 08:31

    labview扫描字符串怎么用

    LabVIEW 是种流程化编程语言和开发环境,主要用于控制、测量和监测系统。在 LabVIEW ,扫描字符串项常见的任务,它允许用户按照
    的头像 发表于 12-29 10:12 2031次阅读