LeetCode242-有效的字母异位词 | 算法练习系列

178 阅读3分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

前言

js每日一道算法题,今天继续来一道字符串相关的简单题目,判断两个字符串是否互为有效的字母异位词,下面我们来看看具体的题目

题目描述

给定两个字符串 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) {
    return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};

  • what fuck? 哈哈哈,这可太简练了,只用判断长度是否相等,再利用排序进行对比,就拿到了我们想要的答案,但这都是用现成的方法,下面我们来另一种方法来解决问题,那就是使用哈希表
  • 哈希表的思路就是先声明一个哈希map,先进行一次for循环把s字符串以字符为键,个数为值的形式存入map,再for循环t字符串,如果map中已经存在了这个键,那么这个键对应的值就减1,如果不存在直接返回false,等t字符串循环完还没return的话,就使用map的values()迭代器,拿到所有键对应的值,通过for循环判断每个值,如果有值不是0就返回false,如果循环完还没结束就返回true,代码如下
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    let map = new Map() //声明Map
    const n1 = s.length
    const n2 = t.length
    if(n1!==n2){ //如果长度都不相等直接return false
        return false
    }
    for(let i=0;i<n1;i++){ //先把第一个字符串存入map
        if(map.has(s[i])){
            map.set(s[i],map.get(s[i])+1)
        }else{
            map.set(s[i],1)
        }
    }
    for(let j=0;j<n2;j++){//如果第二个字符串中有相同的就把map中对应键的值减1
        if(map.has(t[j])){
            map.set(t[j],map.get(t[j])-1)
        }else{
            return false
        }
    }
    var mapIter = map.values() //通过迭代器拿到所以的map值
    for(item of mapIter){
        if(item){ //如果有值
            return false
        }
    }
    return true
};

总结

本题的主要思路就是首先判断两个字符串是否长度相同,然后再比较每个字符的个数是否相同,虽然第一种方法很简练,但sort用的是双层for循环,比较消耗资源,第二种方法的效率就高了很多,继续加油,gogogo!!!