# 有效的字母异位词(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

# 重排字符串

按照字母顺序重组字符串后比较是否相同

export const isAnagram = (s, t) => {
	return s.length === t.length && s.split("").sort().join("") === t.split("").sort().join("");
};
1
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