给定两个字符串 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 * 10^4
- s 和 t 仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解法一:字符串法
解题思路
1.首先比较字符串的长度是否一样,不一样则返回false结束
2.若长度一样,则将字符串都拆分成字符数组进行排序,然后拼接成字符串进行比较,若排序后的两字符串相等,则是有效的字母异位词
代码
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
// 解法一:字符串法
var isAnagram = function(s, t) {
if (s.length !== t.length) {
return false;
}
return [...s].sort().join("") == [...t].sort().join("");
};
解法二:哈希表法
解题思路
1.哈希表:以key为索引,value为值的键值对数组,通过key作为数组的索引,可快速找到对应的value值(哈希函数来查找)
2.首先比较字符串的长度是否一样,不一样则返回false结束
3.若长度一样,则将s中的字符放入到哈希表中,统计每个字符出现的次数
4.最后遍历t中的字符,如果存在在t中而不在s中的情况,则直接返回false;同理,如果存在在s中而不在t中的情况,也可以直接返回false
代码
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
// 解法二:哈希表法
var isAnagram = function(s, t) {
if (s.length != t.length) return false;
let map = [];
// 先把s字符串中的都存到map中
for (let a of s) {
map[a] = (map[a] || 0) + 1;
}
for (let a of t) {
if (map[a]) {
map[a]--;
// 在t中存在字符a多于在s中存在的字符a(本质上也是在s中存在而在t中不存在,因为已判定长度相同)
if (map[a] < 0) {
return false;
}
} else {
// 在t字符串中存在而在s字符串中不存在
return false;
}
}
return true;
}