【数据结构与算法】力扣 49. 字母异位词分组

题目描述

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 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] 仅包含小写字母

分析解答

lodash 里面自带一个方法,可以根据规则对字符串数组进行分组,而分组后的 value 刚好是我们需要的结果。

js 复制代码
import _ from 'lodash'
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    // 先对每个字符串进行排序 作为分组规则(函数返回值为 key) 值为满足规则的数组元素组成的数组 然后进行分组
    /*
     * 例如:_.groupBy([6.1, 4.2, 6.3], Math.floor); // => { '4': [4.2], '6': [6.1, 6.3] }
     */
    const g = _.groupBy(strs, str => str.split('').sort().join(''))
    console.log(g)
    // 返回 value 组成的数组
    return Object.values(g)
};
// 测试代码
console.log(groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))

思路拓展

当然不用 lodash 也可以,我们自己实现一个分组,相当于把以上 lodash 的原理实现了一遍。

js 复制代码
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    let res = {}
    for (let str of strs) {
        let arr = str.split('').sort().join()
        if (res[arr]) {
            res[arr].push(str)
        } else {
            res[arr] = [str]
        }
    }
    return Object.values(res)
};
// 测试代码
console.log(groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))
相关推荐
灰色小旋风13 小时前
力扣 12 整数转罗马数字 C++
开发语言·c++·leetcode
8Qi813 小时前
环形链表刷题笔记(LeetCode热题100--141、142)
c语言·数据结构·c++·算法·leetcode·链表
滴滴答滴答答13 小时前
机考刷题之 13 LeetCode 1004 最大连续1的个数 III
java·算法·leetcode
一叶落43813 小时前
139. 单词拆分(Word Break)
c语言·数据结构·算法·leetcode·深度优先·图论
Yupureki13 小时前
《算法竞赛从入门到国奖》算法基础:数据结构-单调队列
c语言·数据结构·c++·算法
逆境不可逃13 小时前
【从零入门23种设计模式17】行为型之中介者模式
java·leetcode·microsoft·设计模式·职场和发展·中介者模式
重生之我是Java开发战士13 小时前
【递归、搜索与回溯】穷举,暴搜,深搜,回溯,剪枝:全排列与子集
算法·机器学习·剪枝
Yeats_Liao13 小时前
模型剪枝技术:结构化剪枝原理与推理加速实践
算法·机器学习·剪枝
小指纹13 小时前
每日一题--Tokitsukaze and Colorful Chessboard【二分】
数据结构·c++·算法
铭哥的编程日记13 小时前
小企鹅装石头(栈模拟题)
算法