题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = "eat", "tea", "tan", "ate", "nat", "bat"
输出: \["bat","nat","tan","ate","eat","tea"]
解释:
在 strs 中没有字符串可以通过重新排列来形成 "bat"。
字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = ""
输出: \[""]
示例 3:
输入: strs = "a"
输出: \["a"]
提示:
1 <= strs.length <= 104
0 <= strsi.length <= 100
strsi 仅包含小写字母
题解
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<String,List<String>>();
for(String str : strs){
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
思路
- 将字符串中的字符进行排序。因为异位词包含的字母及数量完全相同,所以排序后的结果一定一致(例如 "eat" 和 "tea" 排序后都是 "aet")。这个排序后的字符串就作为哈希表的 Key。
- 使用 HashMap 进行归类。Key 是排序后的字符串,Value 是原始字符串组成的列表。遍历原数组时,利用 getOrDefault 方法将具有相同 Key 的原始字符串追加到同一个 List 中。
- 遍历结束后,Map 中所有的 Value 就是最终的分组结果,将其转换为 List<List<String>> 返回即可。