# 有效的字母异位词(242)
# 题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
# 示例
输入: s = "anagram"
, t = "nagaram"
输出: true
输入: s = "rat"
, t = "car"
输出: false
# 说明
你可以假设字符串只包含小写字母。
# 进阶
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
# 算法
# 数组
声明一个长度为26的数组来存储对应字母出现的次数,
export const isAnagram = (s, t) => {
if (s.length !== t.length) return false;
const letters = new Array(26).fill(0);
for (let i = 0; i < s.length; i++) {
letters[s[i].charCodeAt() - 97]++;
}
for (let i = 0; i < t.length; i++) {
if (--letters[t[i].charCodeAt() - 97] < 0) return false;
}
return true;
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 重排字符串
按照字母顺序重组字符串后比较是否相同
export const isAnagram = (s, t) => {
return s.length === t.length && s.split("").sort().join("") === t.split("").sort().join("");
};
1
2
3
2
3
# 进阶:hash表
因为字符串中包含不确定的unicode字符,所以使用hash表存储每个字符出现的次数
export const isAnagram = (s, t) => {
if (s.length !== t.length) return false;
const map = new Map();
for (let i = 0; i < s.length; i++) {
map.has(s[i]) ? map.set(s[i], map.get(s[i]) + 1) : map.set(s[i], 1);
}
for (let i = 0; i < t.length; i++) {
if (map.get(t[i]) && map.get(t[i]) - 1 >= 0) {
map.set(t[i], map.get(t[i]) - 1);
} else {
return false;
}
}
return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15