题目:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 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] 仅包含小写字母
解题思路:
首先创建一个 HashMap 类型的哈希表 map,用来存储排序后的字母异位词和对应的字母异位词列表。在循环遍历字符串数组 strs 的过程中,将每个字符串转换为字符数组,并对字符数组进行排序,得到排序后的字符串。判断是否已经存在该排序后的字符串作为键,如果不存在,就新建一个空列表,并将原始字符串添加到对应的值列表中;如果已经存在,则直接将原始字符串添加到对应值列表中。 最后,返回哈希表中的值构成的列表,即为分好组的字母异位词。这样可以将具有相同字符集的字符串分到同一组中,通过排序来实现字母异位词的识别。整体时间复杂度为 O(nklogk),其中 n 是字符串数组的长度,k 是字符串的平均长度。
核心代码:
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 sortedStr = String.valueOf(charArray);
// 如果哈希表中不包含该排序后的字符串,新增一个列表
if (!map.containsKey(sortedStr)) {
map.put(sortedStr, new ArrayList<>());
}
// 将原始字符串添加到对应的字母异位词列表中
map.get(sortedStr).add(str);
}
// 返回哈希表中的值构成的列表,即为分好组的字母异位词
return new ArrayList<>(map.values());
}
}