大家好,我是吴师兄
今天的题目来源于 LeetCode 第 242 号问题:有效的字母异位词,难度为「简单」。
一、题目描述
给定两个字符串s
和t
,编写一个函数来判断t
是否是s
的字母异位词。
注意:若s
和t
中每个字符出现的次数都相同,则称s
和t
互为字母异位词。
示例 1:
输入:s="anagram",t="nagaram"
输出:true
示例 2:
输入:s="rat",t="car"
输出:false
提示:
-
1 <= s.length, t.length <= 5 * 104
-
s
和t
仅包含小写字母
进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
二、题目解析
题目讲的是让你判断两个字符串中的字母是否一致,比如示例1中,s
包含字母a、n、g、r、m
,而t
中也包含a、n、g、r、m
,都是只有这五个字母,并且频次相同,只是顺序不同。
看到频次这个词,你脑海中第一想法是什么?
没错,就是哈希表!
解法思路很简单。
1、首先先判断两个字符串长度是否相同,不相同直接返回false
2、然后把s
中所有的字符出现个数使用计数器统计起来,存入一个大小为 26 的数组中(注意题目的说明)
3、最后再来统计t
字符串,即遍历t
时将对应的字母频次进行减少,如果期间 计数器出现小于零的情况,则说明t
中包含一个不存在于s
中的字母,直接返回false
。
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,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论