前端算法-字母异位词

1,810 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第35天,点击查看活动详情

题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

输入: s = "anagram", t = "nagaram"
输出: true

思路一

我们先判断形参s数据的长度和形参t数据的长度是否相等,如果不相等则为false,然后再声明一个table常量,他的长度为26,默认值都为0,然后使用循环去遍历形参s,记录形参s每个字符的频次,然后在使用循环去遍历形参t,减去对应字母的频次,如果出现当前循环的值小于0,那么就说明当前形参t包含一个不在形参s中的额外字符,我们直接返回false即可,如果循环结束没有返回false则直接返回true即可

var isAnagram = function(s, t) {
    if (s.length !== t.length) {
        return false;
    }
    const table = new Array(26).fill(0);
    for (let i = 0; i < s.length; ++i) {
        table[s.codePointAt(i) - 'a'.codePointAt(0)]++;
    }
    for (let i = 0; i < t.length; ++i) {
        table[t.codePointAt(i) - 'a'.codePointAt(0)]--;
        if (table[t.codePointAt(i) - 'a'.codePointAt(0)] < 0) {
            return false;
        }
    }
    return true;
};

思路二

我们先声明一个obj对象,我们使用键值将字符串中出现元素的次数以及其出现的元素使用键值对的方式存储到obj对象中,然后再进行循环形参s字符串,添加到obj对象中,key是字符串的当前循环值,每次循环如果存在则将当前循环值+1,然后再循环形参t字符串,这里每次循环都对obj对象当前拥有的形参t当前循环字符串的value值进行-1操作,最后使用Object.values放啊和结合every方法判断当前obj对象中的value值是否都为0,该值返回布尔值,如果全为0则说明两个字符串相同,返回true,如果不是则返回false

var isAnagram = function (s, t) {
  const obj = {};
  for (var i of s) {
    obj[i] = (obj[i] || 0) + 1;
  }
  for (var i of t) {
    obj[i] = obj[i] - 1;
  }
  return Object.values(obj).every(v => v == 0)
};