题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:输入: strs =
["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:输入: strs =
[""]
输出: [[""]]示例 3:输入: strs =
["a"]
输出: [["a"]]提示:
1 <= strs.length <=
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
解题思路
要将字母异位词组合在一起,我们可以利用哈希表(HashMap)的特性。字母异位词在重新排列后,它们的字符顺序会相同,因此我们可以通过以下步骤实现这一目标:
- 创建哈希表:用来存储排序后的字符串(作为键)和原始字符串的列表(作为值)。
- 遍历字符串数组:对于每一个字符串,将它的字符排序后作为键,如果这个键已经存在于哈希表中,那么将当前字符串添加到这个键对应的列表中;如果这个键不存在,则创建一个新的列表并将当前字符串加入其中。
- 返回结果:遍历完成后,哈希表中存储的所有值即为字母异位词分组的结果。
复杂度分析
-
时间复杂度:O(n * k * log k)。其中
对于每个字符串,排序的时间复杂度为 O(k * log k),总的时间复杂度为 O(n * k * log k)。n
是字符串数组的长度,k
是字符串的平均长度。 -
空间复杂度:O(n * k)。需要使用额外的空间来存储排序后的字符串,以及存储结果的哈希表。哈希表最多需要 O(n * k) 的空间,其中
n
是字符串数组的长度,k
是字符串的平均长度。
代码实现
package org.zyf.javabasic.letcode.hot100.hash;
import java.util.*;
/**
* @program: zyfboot-javabasic
* @description: 字母异位词
* @author: zhangyanfeng
* @create: 2024-08-21 20:26
**/
public class GroupAnagramsSolution {
public List<List<String>> groupAnagrams(String[] strs) {
// 创建一个哈希表,键为排序后的字符串,值为包含该异位词的列表
Map<String, List<String>> anagramMap = new HashMap<>();
// 遍历字符串数组
for (String str : strs) {
// 将字符串的字符排序
char[] chars = str.toCharArray();
Arrays.sort(chars);
String sortedStr = new String(chars);
// 将排序后的字符串作为键
if (!anagramMap.containsKey(sortedStr)) {
// 如果哈希表中不存在这个键,创建一个新的列表
anagramMap.put(sortedStr, new ArrayList<>());
}
// 将原始字符串加入该键对应的列表中
anagramMap.get(sortedStr).add(str);
}
// 返回哈希表中所有的值,即为字母异位词的分组
return new ArrayList<>(anagramMap.values());
}
public static void main(String[] args) {
GroupAnagramsSolution solution = new GroupAnagramsSolution();
String[] strs1 = {"eat", "tea", "tan", "ate", "nat", "bat"};
System.out.println(solution.groupAnagrams(strs1));
// 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
String[] strs2 = {""};
System.out.println(solution.groupAnagrams(strs2));
// 输出: [[""]]
String[] strs3 = {"a"};
System.out.println(solution.groupAnagrams(strs3));
// 输出: [["a"]]
}
}
具体可参考:https://zyfcodes.blog.csdn.net/article/details/141401712