步骤
长度比较:首先检查两个字符串的长度是否相等。如果长度不相等,则直接返回
false
,因为变位词的定义要求两个字符串必须包含相同数量的字符。创建字符计数映射:使用一个
Map
对象来存储第一个字符串中每个字符的出现次数。Map
的键是字符,值是该字符出现的次数。统计第一个字符串:遍历第一个字符串
s
中的每个字符,对于每个字符,如果它已经在Map
中,则将其计数加一;如果不在Map
中,则将其添加到Map
中并设置计数为一。校验第二个字符串:遍历第二个字符串
t
中的每个字符,对于每个字符:
- 检查
Map
中是否存在该字符,并且对应的计数是否大于零。如果字符不存在于Map
中,或者对应的计数为零,则说明第二个字符串包含第一个字符串中没有的字符,因此它们不可能是变位词,返回false
。- 如果字符存在并且计数大于零,将其在
Map
中的计数减一。最终判断:完成第二个字符串的所有字符校验后,如果所有字符都通过了校验,说明两个字符串的字符及其数量完全相同,因此它们是变位词,返回
true
。
题目
示例代码
var isAnagram = function(s, t) {
// 如果两个字符串的长度不相等,则它们不可能是变位词
if (s.length !== t.length) return false;
// 创建一个Map对象(ES6引入的集合类型)
//特性:存储键值对,键的顺序会被记住,键唯一
let count = new Map();
// 遍历字符串s中的每个字符
for(let item of s){
// 如果字符已经在Map中,则增加它的计数,否则设置为1
count.set(item, (count.get(item) || 0) + 1);
}
// 遍历字符串t中的每个字符
for(let item of t){
// 如果Map中没有该字符或者该字符的计数为0,则说明t中有s中没有的字符,返回false
if(!count.get(item)) return false;
// 将Map中该字符的计数减1
count.set(item, count.get(item) - 1);
}
// 如果所有字符都通过了检查,说明s和t是变位词,返回true
return true;
};
欢迎指正!