题目描述:49. 字母异位词分组(中等)
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
LeetCode做题链接:LeetCode-字母异位词分组
示例 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] 仅包含小写字母
题目接口
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
}
}
解题思路
具体思路如下:
创建一个HashMap,用于存储字母异位词分组的结果。key为排序后的字符串,value为同一组异位词的集合。
遍历字符串数组,对每个字符串进行处理。
对当前字符串进行排序,将排序后的字符串作为key。
如果HashMap中已经存在这个key,则将当前字符串添加到对应的value(即同一组异位词的集合)中。
如果HashMap中不存在这个key,则新建一个HashSet,并添加当前字符串,然后将该HashSet作为value,将key-value对添加到HashMap中。
最后,遍历HashMap的所有value,将结果返回。
代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 日常判空
if (strs == null || strs.length == 0) {
return new ArrayList<>();
}
// 第一个参数是排序的字符串,因为字母异位词排序后的字符串是唯一的,第二个参数是字母异位词组,用一个ArrayList存放
HashMap<String, ArrayList<String>> map = new HashMap<>();
for (String str : strs) {
char[] charArray = str.toCharArray();
// 对字符串排序,作为键
Arrays.sort(charArray);
// 在把字符数组转换成字符串
String sortStr = Arrays.toString(charArray);
// 判断map中是否包含这个排序的键
if (!map.containsKey(sortStr)) {
// 没有包含,加入到map中,然后对应的值是空的ArrayList集合
map.put(sortStr, new ArrayList<>());
}
// 把排序前的字符串添加到值中,对应的键是排序后的
map.get(sortStr).add(str);
}
return new ArrayList<>(map.values());
}
}
成功!
PS:
感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个赞喔~