一、题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意: 若 s 和 t **中每个字符出现的次数都相同,则称 s 和 t **互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
二、思路分析
- 分别遍历两个对象,存储对应的字符以及字符出现的次数
- 然后比较两者的次数是否相等
三、代码答案
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
const mp = {}
const mp2 = {}
for (var i = 0; i < s.length; i++) {
if (mp[s[i]]) {
mp[s[i]]++
} else {
mp[s[i]] = 1
}
}
for (var i = 0; i < t.length; i++) {
if (mp2[t[i]]) {
mp2[t[i]]++
} else {
mp2[t[i]] = 1
}
}
const arr = Object.keys(mp)
for (var n = 0; n < arr.length; n++) {
if (mp[arr[n]] !== mp2[arr[n]]) return false
}
return true
};
优化版本
- 只使用一个对象:来记录字符出现的次数,而不需要两个对象。在遍历字符串
s和t的过程中,对于字符串s中的字符,递增对应的计数器;对于字符串t中的字符,递减对应的计数器。最后,如果对象中所有键值对的值都为 0,则两个字符串为字母异位词 - 使用
Map数据结构:可以更方便地操作键值对,避免使用Object.keys方法
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (s.length !== t.length) return false;
const counter = new Map();
for (var i = 0; i < s.length; i++) {
counter.set(s[i], (counter.get(s[i]) || 0) + 1);
counter.set(t[i], (counter.get(t[i]) || 0) - 1);
}
for (const count of counter.values()) {
if (count !== 0) return false;
}
return true;
};