题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

1
2
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

1
2
输入: strs = [""]
输出: [[""]]

示例 3:

1
2
输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

解法

  • 哈希表,模式识别
    • 对单个单词按照字典序进行排序后字母异位词排序的结果是一样的
    • 用一样的字典序排序作为键,能得到同样字典序的字母异位词作值放在list集合中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map=new HashMap<>();
for (String str : strs) {
char[] charArray=str.toCharArray();
Arrays.sort(charArray);
//字典排序
String key=new String(charArray);
if (map.containsKey(key)){
List<String> list = map.get(key);
list.add(str);
map.put(key, list);
}else {
List<String> list=new ArrayList<>();
list.add(str);
map.put(key, list);
}
}
return new ArrayList<List<String>>(map.values());
}
}
  • 时间复杂度:O(nk log k)

来源:力扣(LeetCode)
链接:49. 字母异位词分组 - 力扣(LeetCode)