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

LeetCode 49.字母异位词分组 (HashMap + 字符串排序)

class Solution { // 方法定义:返回双层字符串列表,存储所有异位词分组 public List<List<String>> groupAnagrams(String[] strs) { // 1.创建Map容器:key=排序字符串(分组标签),value=原始单词列表(分组内容) Map<String, List<String>> map = new HashMap<>(); // 2.增强for遍历每一个原始单词 for(String str : strs) { // 3.字符串转字符数组:为排序做准备 char[] s = str.toCharArray(); // 4.字符数组排序:异位词排序后字符串一致 Arrays.sort(s); // 5.排序数组转回字符串,作为唯一分组key String key = new String(s); // 6.判断:当前分组已存在 if(map.containsKey(key)){ // 7.取出对应分组,加入当前原始单词 map.get(key).add(str); }else{ // 8.分组不存在:新建空列表 List<String> temp = new ArrayList<>(); // 9.将当前第一个单词加入新列表 temp.add(str); // 10.存入Map,完成新建分组 map.put(key, temp); } } // 11.取出所有分组,类型转换后返回结果 return new ArrayList<>(map.values()); } }

逐轮运行示例演示

  • 第1轮 str = "eat" → 排序key="aet" → 无分组,新建列表 ["eat"] 存入map

  • 第2轮 str = "tea" → 排序key="aet" → 分组存在,追加为 ["eat","tea"]

  • 第3轮 str = "tan" → 排序key="ant" → 无分组,新建列表 ["tan"] 存入map

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

一、核心算法思路

  • 利用 HashMap 键值对映射特性实现分组,整体时间复杂度接近 O(n logn),为本题最优解法;

  • 遍历每一个字符串,将字符串排序,排序后的字符串作为统一分组 key;

  • key 不存在则新建分组列表,key 存在则将原字符串追加进对应分组;

  • 遍历结束后取出 Map 所有 value,转为 List 集合返回,完成异位词分组。

前置基础:Map 底层基础定义

Map<K, V>
  • K = Key(键):用来查找的标识
  • V = Value(值):你想要保存的数据
  • 判断规则:你打算拿什么东西当「查找标签」,K 就设为什么类型;你最终需要取出什么数据,V 就设为什么类型。
  • 举例对照两道题: 1)两数之和:用数字找下标 →Map<Integer, Integer>2)字母异位词分组:用排序后的字符串找一组单词 →Map<String, List<String>>

(一)语法编译类错误(核心根源:Java 严格区分大小写)

  1. HashMap 创建语法写错
    • 错误:Map<String, List<String>> map = new HashMap<>();
    • 标准固定语法:Map<K,V> 变量 = new HashMap<>();

(二)逻辑思路理解误区

  1. 混淆 Map 的 key 与 value 存储内容
    • key:排序后的标准字符串(仅用来分组标记,不存入结果列表)
    • value:List<String>,存储原始异位单词
  2. 分不清数组与 List 特性
    • String[]:长度固定,不能自动扩容;
    • ArrayList:动态列表,可无限.add()追加元素;
  3. 不懂为什么最后要用new ArrayList<>(map.values())返回map.values()类型是Collection,和要求返回的List不兼容,必须通过 ArrayList 构造转换;

二、Java 专属工具方法积累

1. String 字符串方法

① str.toCharArray()

  • 作用:将字符串拆分为char[]字符数组,字符串不可排序,只有字符数组能排序
  • 用法:char[] 字符数组 = 字符串变量.toCharArray();
String str = "eat"; char[] arr = str.toCharArray(); // arr = {'e','a','t'}

② new String (char 数组)

  • 作用:把排好序的 char 数组重新转回字符串,作为 HashMap 分组 key
  • 用法:String key = new String(字符数组);
char[] arr = {'a','e','t'}; String key = new String(arr); // key = "aet"

2. Arrays 工具类(需导入import java.util.*;

Arrays.sort (char [] 数组)

  • 作用:对字符数组按字母 ASCII 升序排序,异位词排序后完全相同
  • 用法:Arrays.sort(字符数组);
char[] arr = {'t','e','a'}; Arrays.sort(arr); // 排序后 {'a','e','t'}

3. List / ArrayList 方法

① new ArrayList<>()

  • 作用:创建空的动态字符串列表
  • 标准语法:List<String> 变量名 = new ArrayList<>();

② list.add (元素)

  • 作用:向列表尾部追加元素,自动扩容

4. HashMap 核心三方法(解题高频)

① map.get(key)

  • 作用:根据 key 取出对应的 value,仅支持 1 个参数
  • 用法:List<String> group = map.get(key);

② map.put(key, value)

  • 作用:向哈希表存入一组键值对,key 重复会覆盖旧 value
  • 本题用法:map.put(排序字符串, 分组列表);

5. map.values()

  • 作用:获取 Map 中所有 value,返回Collection集合,不含 key
  • 场景:最后统一取出所有分组用于返回结果

三、通用固定模板积累

  1. 创建 HashMap 模板Map<K类型,V类型> map = new HashMap<>();
  2. 创建字符串列表模板List<String> list = new ArrayList<>();
  3. 字符串排序转 key 完整固定流程
char[] arr = str.toCharArray(); Arrays.sort(arr); String key = new String(arr);
  1. Map 分组结果返回模板return new ArrayList<>(map.values());
http://www.jsqmd.com/news/1332985/

相关文章:

  • NoFences:完全免费的Windows桌面分区神器,3分钟打造整洁工作空间
  • 一键去字幕免费版实测:2026年这几种方法亲测好用(手机电脑在线全都有)
  • d2s-editor:暗黑破坏神2存档编辑器的完整指南
  • 2026年,靠谱的苏州吴江装修精装局改厂家揭秘! - 产品评测官
  • 2026年7月安徽省合肥市电信融合宽带攻略与避坑指南 - 领卡园地
  • ZXPInstaller终极指南:3分钟搞定Adobe插件安装的免费神器 [特殊字符]
  • 连锁零售全域数据管控(下):API 化服务输出,释放全域数据业务价值
  • 基于Matlab Robotics Toolbox的六轴工业机器人运动学建模与仿真实践
  • 【关注可白嫖源码】--课程设计--毕业设计--django肥胖儿童运动与健康管理系统[编号:project58555](案件分析)
  • 千万别让AI替你跟客户拍工期
  • Unity集成Dlib人脸特征点检测:跨平台高性能实现方案
  • RK3576 + OpenHarmony 6.1 RKNN2 NPU 验证指南
  • 3ds Max建模布线核心技巧:从基础拓扑到风格化天空屋实战
  • 通识:计算机组成原理 + 计算机网络 + 操作系统
  • 30亿条数据驱动预警,智慧应急从救到防的闭环跃迁
  • 2026年,苏州吴江这家实用装修公司,精装局改超好用! - 产品评测官
  • 实测5家成都geo优化工具软件:头部GEO机构硬核实测横评与企业选型避坑指南 - 资讯报道
  • 如何用AI智能放大技术让模糊图片视频重获新生
  • Java Comparator 实战:多字段排序、thenComparing、reversed 与 null 值处理
  • 英雄联盟玩家的终极效率工具:League Akari 深度使用指南
  • 从 Excel 到电价 API:2026 市场化后能源系统如何结构化维护电价数据
  • 解决Linux下ffmpeg报错libmvec.so.1缺失的完整指南
  • 信号隔离器哪家靠谱?抗干扰性能解析与采购要点全梳理 - 品牌推荐大师
  • 西安总线机箱厂家 8槽总线机箱 型号多样 - 科进网络
  • 网站建设合同.doc怎么签才不踩坑?资深运营揭秘避坑指南与核心条款解析
  • 电力模块采购指南:2026年智算时代高集成供配电方案深度解析
  • Windows跨设备共享:配置指南与效率提升实战
  • 维普AI率怎么降?它和查重根本是两回事,弄反顺序白花两次检测费。
  • AI转 word 工具推荐:平板端首选AI 导出鸭
  • Oracle面试全攻略:从基础到高可用实战解析