题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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] 仅包含小写字母
题解
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//需要归为一个list的单词都是拥有相同的字母和个数
//所以可以考虑将单词的字母进行排序,这样就会是一模一样的单词了
//然后再利用hashmap来存储和查找相同的单词
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
String s = strs[i];
char[] chars = s.toCharArray();
Arrays.sort(chars);
String key = new String(chars);//这是排序完成之后的字符串,作为key
//如果之前map中已经存储了这个字符串就提出来存这个字符串的list,在后面添加当前的就可以了
List list = map.getOrDefault(key, new ArrayList<>());
list.add(s);//注意:要存储字符串原来的样子,要不就会存储的都一样了
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
注意事项
起初的时候用了chars.toString()而不是String key = new String(chars)。这样是不对的,因为直接用toString()的话就会返回的是这么一个String:[class name]@[hashCode]