题目描述
给定两个字符串 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 * 104s和t仅包含小写字母
解题思路
使用 Map 对象统计每个字符在字符串 s 中出现的次数,键是字符,值是字符出现的次数,然后遍历字符串 t,检查每个字符在 Map 对象中的记数是否相等,如果不相等则返回 false,否则对应的字符记数减1。如果没有返回 false,说明两个字符串是字母异位词,返回 true。
时间复杂度 O(n),其中 n 是字符串 s 和 t 的长度之和。
代码
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
// 如果长度不相等,肯定不是字母异位词
if (s.length !== t.length) {
return false;
}
// 使用 record 来记录字符出现的次数
let record = new Map();
// 遍历字符串 s,统计每个字符出现的次数
for (let i = 0; i < s.length; i++) {
const char = s[i];
// 如果 record 中已经有该字符,则将其计数加1;否则将其计数设为1
record.set(char, (record.get(char) || 0) + 1);
}
// 遍历字符串 t,检查每个字符在 record 中的计数是否与 s 中相等
for (let j = 0; j < t.length; j++) {
const char = t[j];
// 如果record中没有该字符,或者该字符的计数已经为0,则说明不是字母异位词
if (!record.has(char) || record.get(char) === 0) {
return false;
} else {
// 将 record 中对应字符的次数减 1
record.set(char, record.get(char) - 1);
}
}
return true;
};