题目
给定两个字符串
s和t,编写一个函数来判断t是否是s的字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true
题解
第一种
我们在函数中先判断s参数的长度,如果s参数的数据长度与当前t参数的长度不相等我们则直接返回false即可,否则我们就在函数中声明了一个名为makeMap的辅助函数,在函数中将输入字符串中每个字符映射到它在字符串中出现的次数,这里我们通过使用map对象来实现的,我们现在该函数中声明一个map变量,值为一个对象,该对象初始为空,然后我们遍历输入字符串中的每个字符,我们将该字符的计数增加到map对象中,接下来我们使用isAnagram函数调用makeMap函数处理输入字符串s和t,创建了两个映射对象mp和mp1,接下来使用函数遍历mp对象中的每个字符,并检查mp1中该字符的计数是否与mp中相同,如果有任何一个字符的计数不同,则函数返回false,否则我们返回true即可
var isAnagram = function(s, t) {
if(s.length!==t.length) return false;
function makeMap(str){
let map = {};
for(let i of str){
map[i]=(map[i]||0)+1;
}
return map;
}
let mp = makeMap(s);
let mp1 = makeMap(t);
for(var s in mp){
if(mp1[s]!==mp[s]) return false;
}
return true;
};
第二种
我们在函数中使用Map数据结构结合两个循环进行实现,我们现在函数中创建了一个Map对象,用于存储统计的数据,然后我们在第一个循环中,我们对于字符串s中的每个字符先从Map中获取该字符的值getMap,如果该值不存在,则将该字符作为键,值设为1,如果该值存在,则将其加1,然后我们在第二个循环中,对于字符串t中的每个字符,它会再次从Map中获取该字符的值getMap,如果该值等于1,则从Map中删除该键值对,如果该值存在且大于1,则将其减1,如果该值不存在,则将该字符作为键,值设为1,最后我们进行判断Map的大小是否为0,则说明s和t不是异位词,返回false,否则返回true即可
var isAnagram = function(s, t) {
const map = new Map()
for (let i = 0; i < s.length; i++) {
const getMap = map.get(s[i])
if (!getMap) {
map.set(s[i], 1)
} else {
map.set(s[i], getMap + 1)
}
}
for (let i = 0; i < t.length; i++) {
const getMap = map.get(t[i])
if (getMap === 1) {
map.delete(t[i])
} else if (getMap) {
map.set(t[i], getMap - 1)
} else {
map.set(t[i], 1)
}
}
if (map.size) {
return false
} else {
return true
}
};
坚持努力,无惧未来!