算法题解-字母异位词

109 阅读2分钟

题目

给定两个字符串 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
  }
};

坚持努力,无惧未来!