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

    文章

    2253

    浏览量

    94343
  • 字母
    +关注

    关注

    0

    文章

    2

    浏览量

    7145
  • 字符串
    +关注

    关注

    1

    文章

    577

    浏览量

    20485

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

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

收藏 人收藏

    评论

    相关推荐

    ASCII码在编程的应用实例

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

    MATLAB(5)--字符串处理

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

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

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

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

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

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

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

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

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

    labview扫描字符串怎么用

    的函数: 文本扫描器(Text Scan)函数:这个函数可以从一个字符串中提取出特定的数据,例如数字或者其他文本。你可以指定要提取的数据的格式,如整数、浮点数等。文本扫描器函数还可以跳过不需要的字符字符串。 分割
    的头像 发表于 12-26 16:58 1864次阅读

    labview怎么对字符串的进行实时处理

    LabVIEW是种用于开发控制、测试和测量系统的可视化编程环境,它提供了许多处理字符串的功能。在LabVIEW,可以使用不同的函数和工具来实时处理字符串。下面我将详细介绍
    的头像 发表于 12-26 14:12 1754次阅读

    oracle字符串split成多个

    Oracle是种广泛使用的关系型数据库管理系统,它提供了许多强大的功能和函数,用于处理和操作数据。其中之就是字符串分割(split)方法,该方法用于将一个字符串按照指定的分隔符分割
    的头像 发表于 12-06 09:54 5100次阅读

    oracle判断字符串包含某个字符

    字符串操作是任何编程语言中都非常重要的部分,Oracle数据库作为目前最常用的关系型数据库之,也提供了丰富的字符串操作函数和方法。在本文中,我们将详细解析如何在Oracle
    的头像 发表于 12-06 09:53 1.4w次阅读

    oracle拼接字符串函数wm_con

    在Oracle数据库,有时候我们需要将多个字符串拼接成一个字符串,以满足特定的需求。而Oracle提供了个非常方便的函数,就是WM_CONCAT函数。本文将详细介绍WM_CONCA
    的头像 发表于 12-06 09:51 1413次阅读

    oracle拼接字符串函数

    在Oracle,我们可以使用 CONCAT 函数来拼接字符串。CONCAT 函数接受两个参数,它将这两个参数连接起来并返回相应的字符串结果
    的头像 发表于 12-06 09:49 2802次阅读

    java equalsignorecase性能问题介绍

    java的equalsIgnoreCase方法是用于比较两个字符串是否相等,但不考虑大小写的差异。在使用equalsIgnoreCase方法时,可能会涉及到性能的问题。这篇文章将细致地讨论
    的头像 发表于 12-03 11:05 7.1w次阅读

    c语言字符串定义

    字符串的定义、初始化、操作和常见问题。 字符串的定义和初始化 在C语言中,字符串被定义为一个字符数组。可以通过种方式来定义和初始化
    的头像 发表于 11-24 10:02 1789次阅读

    python如何统计字符串字母个数

    Python中统计字符串字母个数的方法有多种,下面我会详细介绍些常用的方法。 方法:使用循环遍历
    的头像 发表于 11-23 16:29 1.3w次阅读