当前位置: 首页 > news >正文

LeetCode LCR 033. 字母异位词分组

LeetCode LCR 033. 字母异位词分组


题目描述

给定一个字符串数组 strs,要求将互为变位词(字符出现次数相同但顺序不同的字符串)的字符串分组,并返回分组后的结果列表。
示例
输入:strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:[["bat"], ["nat","tan"], ["ate","eat","tea"]]


核心思路

变位词的核心特征是字符组成完全相同,只是顺序不同。因此,可以通过以下步骤实现分组:

  1. 统一标识:将每个字符串转换为统一的“标识”,使得同一组的变位词具有相同的标识。
  2. 哈希表映射:用哈希表存储“标识”到“字符串列表”的映射,最终提取所有值即为结果。

解法实现
方法:排序 + 哈希表
  1. 排序生成标识:将每个字符串的字符排序,排序后的字符串作为哈希表的键。
  2. 哈希表分组:遍历所有字符串,以排序后的字符串为键,将原始字符串存入对应的列表中。

时间复杂度

  • 每个字符串排序的时间复杂度为 O(k log k)k 为字符串长度)。
  • 总体时间复杂度:O(n * k log k),其中 n 是字符串数量。

空间复杂度

  • O(n * k),用于存储哈希表的所有键和值。
public static List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> map = new HashMap<>();for (String str : strs) {char[] array = str.toCharArray();Arrays.sort(array); // 生成统一标识String key = new String(array);List<String> list = map.getOrDefault(key, new ArrayList<>());list.add(str);map.put(key, list); // 更新哈希表}return new ArrayList<>(map.values());
}

代码解析
  1. 排序生成键

    char[] array = str.toCharArray();
    Arrays.sort(array);
    String key = new String(array);
    
    • 将字符串转为字符数组并排序,排序后的字符串作为唯一标识。
    • 例如,"eat""tea" 排序后均为 "aet",因此归为同一组。
  2. 哈希表操作

    List<String> list = map.getOrDefault(key, new ArrayList<>());
    list.add(str);
    map.put(key, list);
    
    • map.getOrDefault:安全获取键对应的列表,若不存在则新建空列表。
    • 将当前字符串加入列表,并更新哈希表。
  3. 返回结果

    return new ArrayList<>(map.values());
    
    • 直接提取哈希表的所有值(即分组后的列表)。

示例解析

以输入 ["eat", "tea", "tan", "ate", "nat", "bat"] 为例:

  1. 排序生成键
    • "eat" → "aet""tea" → "aet""ate" → "aet"
    • "tan" → "ant""nat" → "ant"
    • "bat" → "abt"
  2. 哈希表分组
    • "aet" → ["eat", "tea", "ate"]
    • "ant" → ["tan", "nat"]
    • "abt" → ["bat"]

优化与变体
  1. 字符计数法
    用字符出现次数作为标识(例如 a1b0c2...),避免排序的时间开销。
    时间复杂度O(n * k)k 为字符集大小)。
    适用场景:字符串较长时更高效。

    public static List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String s : strs) {int[] count = new int[26];for (char c : s.toCharArray()) count[c - 'a']++;String key = Arrays.toString(count); // 例如 "[2,0,1,...]"map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);}return new ArrayList<>(map.values());
    }
    
  2. 质数乘积法
    为每个字母分配一个质数,计算字符串的质数乘积作为键。
    优点:避免字符串拼接或排序的开销。
    缺点:可能溢出(需使用大整数)。


力扣通过截图

在这里插入图片描述

总结
方法时间复杂度空间复杂度适用场景
排序+哈希表O(n * k log k)O(n * k)通用场景,代码简洁
字符计数法O(n * k)O(n * k)字符串较长时更优
质数乘积法O(n * k)O(n)小规模数据,无溢出风险时使用

推荐使用排序+哈希表法,代码简洁且易于理解,适合面试快速实现。若追求极致性能,可尝试字符计数法。

http://www.xdnf.cn/news/300439.html

相关文章:

  • springboot微服务连接nacos超时
  • CTF-DAY8
  • unordered_map和unordered_set的设计
  • OpenGl实战笔记(3)基于qt5.15.2+mingw64+opengl实现光照变化效果
  • 高性能网络优化:深入解析忙轮询(Busy Polling)技术
  • 如何把阿里云a账号下面的oss迁移到阿里云b账号下面(同区域)
  • Nginx 安全防护与 HTTPS 部署
  • UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画
  • Kali:利用rockyou文本字典hash破解zip压缩包密码
  • MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南
  • 探秘数据中台:五大核心平台的功能全景解析
  • QuecPython+Aws:快速连接亚马逊 IoT 平台
  • 从试错到智能决策:Python与强化学习优化自动驾驶策略
  • Netty 的 Reactor 模型
  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23
  • 掌握 Git 常用命令,高效管理项目版本
  • java安全入门
  • Kotlin空安全解决Android NPE问题
  • 第八章--图
  • LeetCode 3423. 循环数组中相邻元素的最大差值 题解
  • homebrew安装配置Python(MAC版)
  • Oracle01-入门
  • 个人Unity自用面经(未完)
  • 神经网络中之多类别分类:从基础到高级应用
  • ChatGPT对话导出工具-轻松提取聊天记录导出至本地[特殊字符]安装指南
  • 审计数据整合:集团多主体科目余额表合并全流程解析
  • JVM内存模型深度解剖:分代策略、元空间与GC调优实战
  • 在 Laravel 12 中实现 WebSocket 通信
  • pyqt写一个TCP(UDP)检测工具
  • 【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`