题目描述:
49. 字母异位词分组
难度 中等
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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基础不清楚的小伙伴可以去回顾一下这里不再赘述)
代码:
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());}
}
最后大功告成!