题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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]
仅包含小写字母
解题方法
排序
只要搞懂什么是字母异位词,思路还是挺简单的。
我们可以用哈希表存储字母异位词,key
就用字母异位词从小到大排序后组成的单词,value
存储相同单词的字母异位词。
举个例子,假设字符串数组为["eat", "tea", "tan", "ate", "nat", "bat"]
,那按照上面的思路,我们的哈希表
就为如下所示。
key | value |
---|---|
aet | [eat, tea, ate] |
ant | [tan, nat] |
abt | [bat] |
java代码
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for(String valueStr : strs) {
char[] cs = valueStr.toCharArray();
Arrays.sort(cs);
String keyStr = new String(cs);
if (!map.containsKey(keyStr)) {
map.put(keyStr, new ArrayList<>());
}
map.get(keyStr).add(valueStr);
}
List<List<String>> result = new ArrayList<>(map.values());
return result;
}
复杂度分析
时间复杂度:
O
(
n
k
l
o
g
k
)
O(nklogk)
O(nklogk),
n
n
n为字符串数组长度,
k
k
k为数组中最长字符串的长度。需要遍历一次字符串数组;对于每个字符串,需要
O
(
k
l
o
g
k
)
O(klogk)
O(klogk)的时间复杂度进行排序。
空间复杂度:
O
(
n
k
)
O(nk)
O(nk),需要提供哈希表存储所有字符串。
- 个人公众号
- 个人小游戏