由leetcode49得来
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
package Hash;
import com.sun.nio.file.SensitivityWatchEventModifier;
import java.lang.reflect.Array;
import java.util.*;
/**
* @Description: 字母异位词分组
* @Author: wangKai
* @Date: 2025/6/8 12:28
*/
public class Solution49 {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<char[],List<String>> hashMap = new HashMap<>();
for (int i = 0; i <strs.length; i++) {
char[] a = strs[i].toCharArray();
Arrays.sort(a);
if (hashMap.containsKey(a)){
hashMap.get(a).add(strs[i]);
}else {
List<String> list = new ArrayList<>();
list.add(strs[i]);
hashMap.put(a,list);
}
}
return new ArrayList<>(hashMap.values());
}
}
输出错误,可以看到,hashmap没有起到分组的多用
分析原因
由于
1使用数组(char[])作为 HashMap 的键。由于数组的 equals() 和 hashCode() 方法是基于引用而非内容的,即使两个数组内容相同,它们也会被视为不同的键,导致无法正确分组字母异位词
此时应该将键替换为String类型的,它们的equals()
和hashCode()
方法基于内容实现.
2 另外 a.toString()
对数组直接调用 toString()
,返回的是 数组类型和内存地址(格式为 [C@哈希值]
),而非数组内容。
此时可以使用
class Solution {
public List<List<String>> groupAnagrams(String[] strs){
HashMap<String,List<String>> hashMap = new HashMap();
for (int i = 0; i <strs.length ; i++) {
char[] temp = strs[i].toCharArray(); //将字符串转为字符数组
Arrays.sort(temp); //字符数组排序
//在hashmap中查询有没有该排好序的字符串
List<String> list = hashMap.getOrDefault(new String(temp),new ArrayList<>());
//在list集合中放入刚弄出来的字符串
list.add(strs[i]);
hashMap.put(new String(temp),list);
}
return new ArrayList<>(hashMap.values());
}
}