❓242. 有效的字母异位词
难度:简单
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
提示:
- 1 < = s . l e n g t h , t . l e n g t h < = 5 ∗ 1 0 4 1 <= s.length, t.length <= 5 * 10^4 1<=s.length,t.length<=5∗104
s和t仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
💡思路:
方法一:排序
t 是 s 的异位词等价于「两个字符串排序后相等」。
- 因此我们可以对字符串
s和t分别排序,看排序后的字符串是否相等即可判断。 - 此外,如果
s和t的长度不同,t必然不是s的异位词。
方法二:哈希映射
- 首先判断两个字符串长度是否相等,不相等则直接返回
false; - 若相等,则初始化 26 个字母哈希表;
- 遍历
s, 在对应位置增加; - 再遍历
t负责在对应位置减少,如果有一个哈希表的值都为0,则返回false; - 都遍历完没有返回
false,则为有效的字母异位词,返回true。
🍁代码:(Java、C++)
方法一:排序
Java
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
}
C++
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) return false;
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
方法二:哈希映射
Java
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
int[] chars = new int[26];
for(char c : s.toCharArray()){
chars[c - 'a']++;
}
for(char c : t.toCharArray()){
if(--chars[c - 'a'] < 0) return false;
}
return true;
}
}
C++
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) return false;
vector<int> chars(26, 0);
for(char c : s){
chars[c - 'a']++;
}
for(char c : t){
if(--chars[c - 'a'] < 0) return false;
}
return true;
}
};
🚀 运行结果:

🕔 复杂度分析:
- 时间复杂度:
O
(
n
)
O(n)
O(n),其中
n为s的长度;排序为: O ( n l o g n ) O(nlogn) O(nlogn)。 - 空间复杂度:
O
(
S
)
O(S)
O(S),其中
S为字符集大小,此处S = 26;排序为: O ( l o g n ) O(logn) O(logn)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!



















