这是我参与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!!!