题目描述:
难度 中等
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解题思路分析:
题目意思简而言之就是,所有输入的单词,不关注单词中字母的排列顺序,只要字母都相同的就分为一组。
那么我们可以创建一个map集合,map集合的key存放每个单词排序后的字符串,map集合的value存放一个List集合(该集合中存放所有字母都相同的单词)。
实现步骤:
1.将输入的字符串数组分别循环取出
2.取出字符数组中的单个字符串后,再将将每个字符串转成字符数组
3.把字符数组排序后再转成字符串作为map集合的key
4.查看map集合中是否有排序后字符串的key对应的值,没有则对该key创建一个value值(ArrayList<String>)
5.将当前的字符串存放到当前key对应的map集合中
6.创建一个ArrayList集合存入所有map集合的value后返回【return ArrayList<List<String>>(map.values())】
**注意:**List<String> list = map.getOrDefault(key, new ArrayList<String>()); 这里用List接收(向上转型,这个是java基础不清楚的小伙伴可以去回顾一下这里不再赘述)
代码:
java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap();
// 循环每个字符串数组
for (String str : strs) {
// 将字符串数组转成字符数组
char[] chars = str.toCharArray();
// 将字符数组中的字符排序
Arrays.sort(chars);
// 将排序后的字符数组转成新的排序后字符串
String key = new String(chars);
// 获取当前map集合中key对应的list集合,没有则新建一个list集合
List<String> list = map.getOrDefault(key, new ArrayList<String>());
// 将当前字符串添加到list集合中
list.add(str);
// 存入排序后的字符串作为key,存入当前字符串
map.put(key, list);
}
// 取出map中的所有value放入ArrayList集合中返回
return new ArrayList<List<String>>(map.values());
}
}
最后大功告成!