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

408 阅读2分钟

题目

题目链接:leetcode-cn.com/leetbook/re…

image.png

题解


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

juejin.cn/post/700669…