LeetCode 👉 HOT 100 👉 字母异位词分组 - 中等题

178 阅读2分钟

「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」。

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例1

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例2

输入: strs = [""]

输出: [[""]]

示例3

输入: strs = ["a"]

输出: [["a"]]

思路

这道题的关键需要理解题目的意思,什么是 字母异位词,简单来说就是由相同字母及相同个数组成的不同单词;例如:eataet,是一组 字母异位词,因为它们都是由相同数量的字母 e、a、t 组成的不同单词。理解了题目的意思,那么解题思路就很清晰了,关键就在于区分两个单词,是不是属于同一组 字母异位词,步骤如下:

  • 定义 字母异位词 的标识为单词所有字符,按 Unicode 编码,从小到大排列的字符串

  • 定义一个函数 getStrNum,接收一个单词参数,返回这个单词所属的 字母异位词 组标识

  • 定义 ansMapObject 结构,存放 字母异位词

  • 遍历题目所给字符串数组

    • 利用 getStrNum 函数,判断当前字符串的 标识

    • 将当前字符串放入 ansMap 对应的 字母异位词组 数组中 ansMap[strNum].push(strs[i])

  • ansMap 中所有的 value 放入数组中返回,即为题目所求

代码如下

    /**
     * @param {string[]} strs
     * @return {string[][]}
     */
    var groupAnagrams = function(strs) {
        let ansMap = {}, ansArr = [];

        const getStrNum = str => {

            return str.split('').sort((a, b) => a.charCodeAt() - b.charCodeAt()).join('');
        }

        for(let i = 0; i < strs.length; i++) {
            let strNum = getStrNum(strs[i]);

            if(!ansMap[strNum]) {
                ansMap[strNum] = [];
            }
            ansMap[strNum].push(strs[i]);
        }

        Object.keys(ansMap).forEach(key => {
            ansArr.push(ansMap[key]);
        })

        return ansArr;
    };

小结

读懂题目的意思,才能更好的处理问题

LeetCode 👉 HOT 100 👉 字母异位词分组 - 中等题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍

如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄