题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
样例描述
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
思路
排序 + 字符串哈希
- 符合异位词的显然满足:按ASCII码排序后都是一样的,因此可以将排序后的作为key,将所有排序后等于key的放进这一组。 也就是将每个字符串归类,按照所属于排序后的那个字符串所在的组。
- Map的方法:
map.values()
可以直接获得map的值的集合。 - 如果忘记
map.values()
,就用for each 加上 entry来遍历map 获取每个value
代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
List<List<String>> res = new ArrayList<>();
for (String s: strs) {
char ch[] = s.toCharArray();
Arrays.sort(ch);
String t = new String(ch);
List<String> list = map.getOrDefault(t, new ArrayList<>());
list.add(s);
map.put(t, list);
}
for (Map.Entry<String, List<String>> entry: map.entrySet()) {
res.add(entry.getValue());
}
// for (List<String> val: map.values()) {
// res.add(val);
// }
return res;
// return new ArrayList<>(map.values());
}
}