字母异位词分组 | LeetCode中等算法题

题目描述

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

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

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

题目解析

字母异位词的字母成分一定是相同的,目标是把相同字母成分的字符串放到一个分组里。

属于根据特征进行归类的模式,应该利用散列表。因此分两步,

  1. 初始化一个哈希表,key为字母成分(通过排序后的字母串作为唯一标识),值为该成分下的所有字母异位词字符串;

  2. 遍历元素字符串,如果该字母成分未出现在哈希表中,加入哈希表,字母成分串对应的组合也增加该元素;如果已出现在哈希表,获取组合列表,追加该元素

参考代码

以下为 Java 代码。

/**
字母异位词的字母成分一定是相同的,目标是把相同字母成分的字符串放到一个分组里。
属于根据特征进行归类的模式,应该利用散列表。
因此分两步,
1、初始化一个哈希表,key为字母成分(通过排序后的字母串作为唯一标识),值为该成分下的所有字母异位词字符串;
2、遍历元素字符串,如果该字母成分未出现在哈希表中,加入哈希表,字母成分串对应的组合也增加该元素;如果已出现在哈希表,获取组合列表,追加该元素
 */
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {

        //初始化key为字母成分唯一标识,值为字母异位词字符串列表的哈希表
        Map<String,List<String>> letter2TarList = new HashMap<String,List<String>>();

        for(String str:strs){
            
            //通过排序方式构建字母成分唯一标识
            char[] letterArr=str.toCharArray();
            Arrays.sort(letterArr);
            String letterKey = new String(letterArr);

            //获取字母成分唯一标识下的字母异位词列表
            List<String> tempGroup = letter2TarList.getOrDefault(letterKey,new ArrayList<String>());

            //追加当前字符串
            tempGroup.add(str);

            //更新哈希表
            letter2TarList.put(letterKey,tempGroup);
        }

        return new ArrayList<List<String>>(letter2TarList.values());

    }
}

复杂度分析

  • 时间复杂度:O(nklog⁡k)。

    • 其中 n 是入参数组 strs 中的字符串的数量,k 是字符串的最大长度。

    • 需要遍历 n 个字符串,对于每个字符串,需要 O(klog⁡k)的时间进行排序以及 O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklog⁡k)。

  • 空间复杂度:O(nk)。

    • 其中 n 是入参数组 strs 中的字符串的数量,k 是字符串的的最大长度。需要用哈希表存储全部字符串。


我是蜗牛,大厂程序员,专注技术原创和个人成长,正在互联网上摸爬滚打。欢迎关注我,和蜗牛一起成长,我们一起牛~下期见!

推荐阅读:

1120页的Leetcode算法刷题笔记,完整版PDF开放下载!

《Java 工程师成神之路》.pdf

点阅读原文发现更多Java资源宝藏~

 
 
 
 
 
 
 
 
点分享
点收藏
点点赞
点在看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛互联网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值