LeetCode 49. 字母异位词分组

49. 字母异位词分组

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

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

示例 1:

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

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

示例 2:

输入: strs = [""]

输出:[[""]]

示例 3:

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

输出: [["a"]]

提示:

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

解法思路:

1、排序

2、计数

法一:

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 排序, n 是 strs 中字符串数量,k 是 strs 中字符串最大长度
        // Time: O(nklogk)
        // Space: O(nk)
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            char[] chs = str.toCharArray();
            Arrays.sort(chs);
            String key = new String(chs);
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

法二:

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 计数, n = strs.length,k = Max(str.length()), ∣Σ∣ = 26
        // Time: O(n(k+∣Σ∣))
        // Space: O(n(k+∣Σ∣))
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            int[] counts = new int[26];
            int len = str.length();
            for (int i = 0; i < len; i++) {
                counts[str.charAt(i) - 'a']++;
            }
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                if (counts[i] != 0) {
                    sb.append((char) ('a' + i));
                    sb.append(counts[i]);
                }
            }
            String key = sb.toString();
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}
相关推荐
LiuYaoheng7 分钟前
【Android】View 的基础知识
android·java·笔记·学习
山河君14 分钟前
webrtc之高通滤波——HighPassFilter源码及原理分析
算法·音视频·webrtc·信号处理
勇往直前plus14 分钟前
Sentinel微服务保护
java·spring boot·微服务·sentinel
星辰大海的精灵15 分钟前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
小鸡脚来咯17 分钟前
一个Java的main方法在JVM中的执行流程
java·开发语言·jvm
江团1io018 分钟前
深入解析三色标记算法
java·开发语言·jvm
data myth20 分钟前
力扣1210. 穿过迷宫的最少移动次数 详解
算法·leetcode·职场和发展
天天摸鱼的java工程师27 分钟前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
惯导马工29 分钟前
【论文导读】AI-Assisted Fatigue and Stamina Control for Performance Sports on IMU-Gene
深度学习·算法
你我约定有三31 分钟前
java--泛型
java·开发语言·windows