题目
题目链接:leetcode-cn.com/leetbook/re…
题解
1、先给字符串排序,再比较
因为在 JavaScript 中,字符是以 Unicode 编码,所以可以先将字符串转换成字符数组,然后再对字符数组排序,如果两字符串排序后的结果一样,则两字符串互为字母异位词;
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length !== t.length) {
return false;
}
let sArr = s.split(''),
tArr = t.split('');
// 排序
sArr.sort(function(a,b){
return a.charCodeAt()-b.charCodeAt();
});
tArr.sort(function(a,b){
return a.charCodeAt()-b.charCodeAt();
});
// 对比排序结果
if(sArr.toString() === tArr.toString()) {
return true;
}else {
return false;
}
};
2、借助辅组空间记录两个字符串
一看到题目,我就想先遍历两个字符串一遍,使用 普通对象 或 Map 记录分别每个字母出现的次数,如果得到的 普通对象 或 Map 相同,则两个字符串互为异位词;
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length !== t.length) {
return false;
}
let sMap = new Map(),
tMap = new Map();
for(let item of s) {
if(sMap.get(item) === undefined) {
sMap.set(item,1);
}else {
sMap.set(item,sMap.get(item) + 1);
}
}
for(let item of t) {
if(tMap.get(item) === undefined) {
tMap.set(item,1);
}else {
tMap.set(item,tMap.get(item) + 1);
}
}
// 判断两个Map是否相等并不能使用 === ,于是采用如下从一个Map中逐个取出属性,然后看另一个对象中是否有对应属性
for(let [key,value] of sMap) {
if( tMap.get(key) === undefined || tMap.get(key) !== value) {
return false;
}
}
return true;
};
改进
上面的方法使用了两个 Map,下面只使用一个 Map; 一个循环 Map 将字符串中各字符出现的次数记录下来,另一个循环将另一个字符串中的各字符遍历,如果 Map 中存有相应字符,就对对应的个数减1,直到个数为0就将这个属性从 Map 中删除;如下:
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length !== t.length) {
return false;
}
let sMap = new Map();
// 添加 Map 中的 属性
for(let item of s) {
if(sMap.get(item) === undefined) {
sMap.set(item,1);
}else {
sMap.set(item,sMap.get(item) + 1);
}
}
// 删除 Map 中的 属性
for(let item of t) {
let value = sMap.get(item);
if(value !== undefined) {
sMap.set(item,value - 1)
if(sMap.get(item) === 0) {
sMap.delete(item);
}
}else {
return false;
}
}
if(sMap.size === 0) {
return true;
}else {
return false;
}
};
大家如果有更好的思路和解法,欢迎大家一起来讨论啊~
这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里: