LeetCode——面试题 10.02. 变位词组[Group Anagrams LCCI][中等]——分析及代码[Java]
一、题目
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 哈希表
(1)思路
本题可结合哈希表求解,以变位词组的一个共同特征为键,各个具体的变位词组成的列表为值。
在键的选择上,可以选取变位词组中字典序最小的变位词,也可采用各个字符的数量等其他方案,只需唯一且便于编码即可。
(2)代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<String, List<String>>();//哈希表,以每个变位词组中字典序最小的变位词为键
for (String str : strs) {//遍历字符串数组
char[] c = str.toCharArray();//转为char[],便于排序
Arrays.sort(c);//排序,获得字典序最小的变位词
String key = String.valueOf(c);
List<String> val = map.getOrDefault(key, new ArrayList<String>());
val.add(str);//加入当前字符串
map.put(key, val);
}
return new ArrayList<List<String>>(map.values());//哈希表的值空间就是本题待求解的答案
}
}
(3)结果
执行用时 :7 ms,在所有 Java 提交中击败了 96.44% 的用户;
内存消耗 :41.1 MB,在所有 Java 提交中击败了 88.95% 的用户。
三、其他
暂无。