题目链接
思路
- 用一张表存储 s 每个字母的出现次数
- 遍历 t 的所有字母,找出字母出现次数:
- 如果没有该记录,说明这个字母在 t 中的出现次数多于 s。
- 如果记录为 1, 删去这条记录,因为它被抵消,次数为 0 了。
- 如果记录大于 1,使它在 map 中的出现次数 -1。
- 如果 map 里还有记录,说明抵消完 t 的字母以后,s 还有多的字母,s 的字母数多于 t。
- 能走到这里说明没有违规,s 和 t 互为字母异位词。
时间复杂度
O(N*M), 其中 N 是 s 的长度, M 是 t 的长度。 因为真个过程就是遍历了一次 s, 遍历了一次 t。
额外空间复杂度
O(N),N 是 s 的长度。因为用了一张 Map,最坏情况是 s 的所有字母都只出现一次。
TypeScript
function isAnagram(s: string, t: string): boolean {
const map = new Map();
for (let i = 0, len = s.length; i < len; i++) {
const c = map.get(s[i]);
map.set(s[i], c ? c+1 : 1);
}
for (let i = 0, len = t.length; i < len; i++) {
const c = map.get(t[i]);
if (!c) {
return false;
}
if (c === 1) {
map.delete(t[i]);
} else {
map.set(t[i], c-1);
}
}
if (map.size > 0) {
return false;
}
return true;
}