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

    文章

    2121

    浏览量

    92976
  • 字母
    +关注

    关注

    0

    文章

    2

    浏览量

    7118
  • 字符串
    +关注

    关注

    1

    文章

    551

    浏览量

    20123

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    java equalsignorecase性能问题介绍

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

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

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

    java equalsignorecase性能

    java中的equalsIgnoreCase方法是用于比较两个字符串是否相等,忽略大小写。它返回一个布尔值,如果两个字符串相等,则返回true,否则返回false。 在进行字符串比较
    的头像 发表于 11-17 16:45 4.6w次阅读

    mysql字符串包含某个字符串

    MySQL是一种开源的关系型数据库管理系统,被广泛用于构建Web应用程序和其他大型数据驱动的应用。在进行MySQL数据库查询时,经常需要使用字符串包含操作,即判断个字符串是否包含另一
    的头像 发表于 11-16 14:52 1135次阅读

    怎样进行字符串转数字?

    除了使用sprintf之外,自己写一个字符串转数字的程序应该怎样处理?sprintf的效率很低
    发表于 11-10 07:18

    Python 如何判断字符串是否包含子串

    1、使用 in 和 not in in 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符 。 使用这两个成员运算符,可以很让我们很直观清晰的判断一个对象是否
    的头像 发表于 11-02 10:55 254次阅读

    c语言如何对比字符串是否相同?

    c语言如何对比字符串是否相同把一个字符串变量直接赋值给另个变量怎么实现
    发表于 11-02 07:45

    如何使用JDK截断一个字符串

    目标。 使用JDK截断一个字符串 Java提供了许多方便的方法来截断一个 String 。让我们来看看。 使用 String 的 substring() 方法 String 类有一个方便的方法,叫做
    的头像 发表于 10-08 15:43 313次阅读

    代码字符串分割方法

    我们写代码的时候,经常会遇到这样一个场景,那就是分割字符串。比如说把一个字符串分成N个,或者说按照N个字符分割。 我们今天就来看看怎么每隔N个字符分割
    的头像 发表于 09-25 11:42 424次阅读

    KUKA机器人: 如何比较两个字符串变量

    用功能 StrComp() 可以比较两个字符串变量。 Comp = StrComp( StrComp1[], StrComp2[], CaseSens )
    的头像 发表于 07-10 09:27 628次阅读

    如何遍历中文字符串

    今天和大家分享下如何遍历中文字符串,主要是如何打印中文字符,因为中文字符串个字符占用不只一个字节的空间,如果我们逐
    的头像 发表于 07-03 09:15 389次阅读
    如何遍历中文<b class='flag-5'>字符串</b>

    如何把字符串公式并得出结果?

    如图示一个字符串写的加减乘除运算公式,如何把字符串公式转换出来并得出结果?
    发表于 05-23 16:31

    Python中检查字符串包含的方法

    Python 有多种处理字符串的方法。今天我们介绍如何检查一个字符串是否包含另一个字符串
    的头像 发表于 05-14 16:02 1.4w次阅读