欢迎光临
我们一直在努力

LeetCode 热题 100 之 49.字母异位词分组

代码实现

// 核心方法:对异位词进行分组
public List<List<String>> groupAnagrams(String[] strs) {
// 定义哈希表:key=排序后的标准化字符串,value=对应异位词列表
Map<String, List<String>> map = new HashMap<>();

for (String s : strs) {
// 1. 将字符串转为字符数组(方便排序,String是不可变的)
char[] charArr = s.toCharArray();
// 2. 对字符数组排序(异位词排序后数组完全相同)
Arrays.sort(charArr);
// 3. 排序后的字符数组转回字符串,作为Map的key
String key = new String(charArr);

// 4. 若key不存在,新建空列表;存在则直接获取已有列表
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
// 5. 将原字符串加入对应key的列表中
map.get(key).add(s);
}

// 6. 将Map的所有value转为List返回(即最终的分组结果)
return new ArrayList<>(map.values());

核心代码解释

  • 容器选择:用HashMap做分组核心,利用其键唯一的特性,保证相同排序结果的异位词归为一组;值用ArrayList存储同组的原字符串。
  • 字符串排序:Java 中String是不可变对象,无法直接排序,需先通过toCharArray()转为字符数组,排序后再通过new String(charArr)转回字符串作为 Key。
  • 键的判空与赋值:判断 Map 中是否存在当前排序后的 Key,不存在则新建ArrayList并放入 Map,避免空指针异常。
  • 结果转换:map.values()会返回所有分组的 List 集合,直接用new ArrayList<>(map.values())转为题目要求的List<List<String>>类型。
  • 部分代码优化

    for (String s : strs) {
    char[] charArr = s.toCharArray();
    Arrays.sort(charArr);
    String key = new String(charArr);
    // computeIfAbsent:key不存在则执行第二个参数新建列表,存在则直接返回已有列表
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
    }

    总结

  • Java 实现异位词分组的核心仍是排序 + 哈希表,区别仅在于字符串的排序操作需要通过字符数组中转;
  • 核心容器为HashMap<String, List<String>>,computeIfAbsent是 Java8 + 简化判空逻辑的常用技巧;
  • 最终结果直接通过new ArrayList<>(map.values())提取,无需额外遍历。
  • 赞(0)
    未经允许不得转载:171主机测评 » LeetCode 热题 100 之 49.字母异位词分组
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址