LC242. 有效的字母异位词(第21题)

134 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

菜鸟就要从第21题继续

一、题目描述:

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2:

输入: s = "rat", t = "car" 输出: false   提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母  

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

第一版:直观上想,分别统计两种中每个字符的频率,然后对比下就可以。这里第一次写忘了考虑s被t包含对的情况。

第二版:由于要求数据两一致,理论上只要各循环一次即可,第一次加1,第二次减1

  • codePointAt()方法返回 一个 Unicode 编码点值的非负整数。

排序:这个思路开始没想到,其实说通了也没啥,就是按顺序排一遍然后比较,代码量很少。[...s].sort().join('') === [...t].sort().join('')的判断方式很不错

  • ...是es6中出现的扩展运算符。作用是遍历当前使用的对象能够访问到的所有属性,并将属性放入当前对象中。这里深拷贝了个数组出来
  • sort()排序
  • join('')合并,这里将数组元素转换为字符串(无分隔符)默认分隔符是逗号 (,)。

注意这里如果不用join会直接对比对象,不会相等。

三、AC 代码:

1、第一版

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if(s.length!=t.length){
        return false
    }
    const smap = _.countBy(s)
    const tmap = _.countBy(t)    
    for(let item in smap){
        if(tmap[item]!=smap[item]){
            return false
        }
    }
    return true
};

2、第二版

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
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;
};

3、排序

var isAnagram = function(s, t) {
    return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};