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

    文章

    2321

    浏览量

    98535
  • 字母
    +关注

    关注

    0

    文章

    2

    浏览量

    7224
  • 字符串
    +关注

    关注

    1

    文章

    596

    浏览量

    23210

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求助 LabVIEW 字符串比较

    请教大神 ,用一个字符串和多个字符串比较程序应该怎么做。 比如:A字符串和B字符串组(B组字符串个数不定可以是
    发表于 03-02 17:24

    打开工程后工程的字体没有显示,如字符串,数字等控件不能预览显示字体?

    打开工程后工程的字体没有显示,如字符串,数字等控件不能预览显示字体?
    发表于 02-25 17:39

    cJSON库是什么?

    。 string如果遇到"开头,则说明json值是字符串,就解析它的值,此时只需要拿到两个"之间的值即可。保存字符串也是个结构体,需要申请内存,计算长度的过程
    发表于 01-29 07:13

    字符串控件与静态字符串控件预览字符显示乱码,如何修改显示正常?

    字符串控件与静态字符串控件预览字符显示乱码,如何修改显示正常?
    发表于 01-20 17:17

    字符串,数字控件如何控制背景颜色和前景字体颜色?

    字符串,数字控件如何控制背景颜色和前景字体颜色?
    发表于 01-20 15:12

    单片机的串口通讯串行同步通信与串行异步通信

    就保证了起始位开始处定会有个下跳沿,由此就可以标志一个字符传输的起始。而根据起始位和停止位也就很容易的实现了字符的界定和同步。 显然,采用异步通信时,发送端和接收端可以由各自的
    发表于 01-15 08:06

    Linux下怎么让中文字符串按照拼音排序?

    求教 Linux 下怎么让中文字符串按照拼音排序?
    发表于 01-06 07:40

    字符串关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符串吗?

    字符串关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符串吗?
    发表于 12-15 08:24

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

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

    RISC-V的工具链GCC内联汇编

    ;;\"作为分隔符,没有添加分隔符的两个字符串会被合并成为一个字符串。“汇编指令列表”的编写语法和普通的汇编程编写是样的。 4.\"输入操作数\",用来指定当前内联汇编程序的输入
    发表于 10-30 06:59

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

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

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

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

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

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

    英语单词学习页面+单词朗读实现 -- 【1】页面实现 ##HarmonyOS SDK AI##

    Speech Kit(基础语音服务),即端侧AI 我们分篇文章来讲解 对于例句单词效果突出显示,开始我想到的是“属性字符串StyledString/MutableStyledString”。 通过阅读相关
    发表于 06-29 23:24

    CAN总线采样点不一致的危害

    时间的87.5%处读取总线状态。以下图示说明了位时间的分段和采样点位置: 当CAN网络的节点配置了不同的采样点时,会引发以下严重问题: 位错误, 不同节点在不同时间采样可能导致对同位的解释不一致
    发表于 06-07 08:55