编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
分析:
方法1:哈希表+排序
因为这些变位词字母都不会变,只是顺序遍历,因此我们可以定义一个哈希表来存储这些变位词,键就为排序后的字符串,值为所有变位词。
时间复杂度:O(Σn*logn) n 为每个字符串的长度
空间复杂度:O(Σn)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创建哈希表,存储字母相同的字符串
HashMap<String, List<String>> map = new HashMap<>();
//遍历字符串数组,对每个字符串的字符进行排序
for(String str: strs){
//转化为字符数组
char[] cs = str.toCharArray();
//排序
Arrays.sort(cs);
//转化回字符串
String s = String.valueOf(cs);
//获取哈希表中对应列表
List<String> list = map.getOrDefault(s, new ArrayList<>());
//添加到列表
list.add(str);
//添加到哈希表
map.put(s, list);
}
//结果集
List<List<String>> res = new ArrayList<>();
//添加到结果集
for(String key: map.keySet()){
res.add(map.get(key));
}
return res;
}
}
方法2:哈希表+排序优化
因为字符串所有字符都为小写字母,因此我们可以通过一个长度为 26 的数组辅助排序,哈希表的键可以用数组的所有值组成的字符串表示。
时间复杂度:O(Σn)
空间复杂度:O(n + ΣC) C 为26
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创建哈希表,存储字母相同的字符串
HashMap<String, List<String>> map = new HashMap<>();
//遍历字符串数组,对每个字符串的字符进行排序
for(String str: strs){
//数组
char[] nums = new char[26];
//对应字母位置相加
for(char c: str.toCharArray()){
nums[c-'a']++;
}
//转化为字符串
String s = String.valueOf(nums);
//获取哈希表中对应列表
List<String> list = map.getOrDefault(s, new ArrayList<>());
//添加到列表
list.add(str);
//添加到哈希表
map.put(s, list);
}
//结果集
List<List<String>> res = new ArrayList<>();
//添加到结果集
for(String key: map.keySet()){
res.add(map.get(key));
}
return res;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams-lcci