【力扣算法题每日一刷】剑指 Offer II 033. 变位词组(中等)

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

一、题目描述

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

注意: 若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

 

示例 1:

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

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

 

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

二、思路分析

题目要求返回一个二维数组,每个元素都是一个一维数组,并且数组元素都 互为变位词 。那么此题关键在于 如何找出变位词

思路:互为变位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

解题流程

  • 创建 Map 对象,用于存储排序后的字符串;
  • 遍历字符串数组 strs ,将遍历到的元素转为数组并排序;
  • 将排序后的当前元素转为字符串,以此作为 key 值查找 Map 对象中是否有相同元素
    • 没有则定义一个空数组,将当前元素 push 进去,将数组存进 Map 中键为 key 的位置上;
    • 有则取出 Map 对象上索引为 key 的值(一个数组),将当前元素 push 进该数组,同样将 push 后的数组存进 Map 中键为 key 的位置上。
  • 遍历完成后,我们得到了一个 键为变位词的其中一种排列、值为变位词数组 的 Map 对象。取出 Map 对象的所有键值,放进数组中即为答案。

三、AC 代码

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    let map = new Map();
    for (let str of strs) {
        const arr = [...str];
        arr.sort();
        const key = arr.toString();
        let list = map.get(key) ? map.get(key) : [];
        list.push(str);
        map.set(key, list);
    }
    return Array.from(map.values());
};