LeetCode49 字母异位词分组|HashMap 分组,数组 toString 大坑

题目描述

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

字母异位词:字母组成完全一样,字符顺序不一样,例如eat、tea、ate。

我的做题思考全过程

审题:要把字母一样、顺序不一样的字符串分到同一组。
我想到一个关键点:异位词把字符排序之后,得到的字符串完全一样。

解题思路:

  1. 使用 HashMap 做分组,key 存放排序后的字符串,value 存放一组原始字符串 List。
  2. 循环遍历字符串数组,取出每一个字符串 s。
  3. String 不能直接排序,转为 char [] 字符数组,调用 Arrays.sort 对数组排序。
  4. 将排完序的字符数组转字符串,作为 map 的 key。
  5. 判断 map 有没有这个 key:没有就新建一个 ArrayList 放进去;有就直接拿到已有的 List。
  6. 把原始字符串 s 添加进 list。
  7. 全部遍历结束,map 的所有 value 就是分组完成的数据,转为 List 返回。

做题踩坑记录(真实写代码遇到的错误)

  1. ❗char 数组不能直接使用arr.toString()
    我写代码写成 String key = arr.toString;,直接编译报错;改成arr.toString()运行也不对。

char 数组调用 toString 得到的是内存地址[C@xxxx,不是字符串内容。
✅正确写法:new String(arr),把 char 数组转为真正的字符串。

  1. 不能new List<List<String>>[]
    Java 不支持直接 new 带泛型的数组,一开始想直接创建二维 List 数组存储分组,编译报错,改用 HashMap 分组才解决。
  2. map.values () 不能直接 returnmap.values()返回的是 Collection 集合,和题目需要返回的List<List<String>>类型不匹配。
    ✅需要包装:new ArrayList<>(map.values())。
  3. 空指针风险
    调用map.get(key).add(s)之前,必须containsKey判断 key 是否存在。
    如果 key 不存在,get 拿到 null,调用 add 直接抛出空指针异常。
  4. for 循环两种写法
    可以用普通 for 下标循环,也可以增强 for 循环。本题我使用下标 for 循环,手动拿strs[i]。

AC 完整代码

import java.util.*;
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map=new HashMap<>();
        for(int i = 0;i<strs.length;i++){
            String s=strs[i];
            char[] arr=s.toCharArray();
            Arrays.sort(arr);
            String key=new String(arr);
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<>());
            }
            map.get(key).add(s);
        }
        return new ArrayList<>(map.values());
    }
}
  • 时间复杂度:(O(n*k \log k)) n 是字符串数量,k 字符串最大长度
  • 空间复杂度:(O(nk))

复习 HashMap 刷题常用 API

表格

方法作用
containsKey(key)判断 map 是否存在该 key,返回 boolean
put(key,value)存入键值对,key 重复会覆盖旧 value
get(key)根据 key 获取 value,不存在返回 null
map.values()获取 map 全部的 value 集合
map.keySet()获取全部 key 集合

总结

  1. char [] 转字符串:new String(char数组),千万不要直接数组.toString ()。
  2. 分组类题目优先想到 HashMap,用一个特征值当 key 做归类。
  3. get 之前优先 containsKey 判断,规避空指针。
  4. Collection 不能直接当 List 返回,用new ArrayList<>(collection)做转换。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐