LeetCode《初级算法》字符串之有效的字母异位词 -- JavaScript

语言: CN / TW / HK

题目

题目链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn96us/

image.png

题解


1、先给字符串排序,再比较

因为在 JavaScript 中,字符是以 Unicode 编码,所以可以先将字符串转换成字符数组,然后再对字符数组排序,如果两字符串排序后的结果一样,则两字符串互为字母异位词; ```js /* * @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 相同,则两个字符串互为异位词;

```js /* * @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 中删除;如下:

```js /* * @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《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里:

https://juejin.cn/post/7006692002125316103