【刷题1】LeetCode 49. 字母异位词分组 java题解

题目

https://leetcode-cn.com/problems/group-anagrams/
在这里插入图片描述

分析

我们的字符数 count 的散列化表示将是一个用# 字符分隔的字符串。 例如,abbccc 将表示为 #1#2#3#0#0#0 …#0,其中总共有26个条目。

复杂度

时间复杂度:O(NK),其中 N 是 strs 的长度,而 K 是 strs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串。
空间复杂度:O(NK),排序存储在 ans 中的全部信息内容。

代码

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List> map=new HashMap<String,List>();
        int[] count=new int[26];
        for(String str:strs){
            Arrays.fill(count,0);
            StringBuilder sb=new StringBuilder();
            char[] chars=str.toCharArray();
            //统计字符串中每个字符的数量
            for(char c:chars){
                count[c-'a']++;
            }
            //用字符串表示每个字符的数量
            for(int i=0;i<26;i++){
                sb.append('#');
                sb.append(count[i]);
            }
            String ssb=sb.toString();
            //如果没有这类字符串,则创建一个这类字符串的List
            if(!map.containsKey(ssb))
                map.put(ssb,new ArrayList<String>());
            //在这类字符串的List的中,加入当前字符串
            map.get(ssb).add(str);
        }
        return new ArrayList(map.values());
    }
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值