❓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专栏,每日更新!