🚩传送门:力扣题目

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,”tan”],[“ate”,”eat”,”tea”]]

解题思路:哈希表

两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

比如 aappaa 均包含 2 个a、1 个p,排序后均为 aap

遍历每个字符串,对于每个字符串排序,得到该字符串所在组的哈希表的键,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。

复杂度分析

时间复杂度: [LC]49. 字母异位词分组 - 图1 ,其中 [LC]49. 字母异位词分组 - 图2[LC]49. 字母异位词分组 - 图3 中的字符串的数量, [LC]49. 字母异位词分组 - 图4[LC]49. 字母异位词分组 - 图5 中的字符串的的最大长度。

空间复杂度:[LC]49. 字母异位词分组 - 图6 ,需要用哈希表存储全部字符串。

官方代码

  1. class Solution {
  2. public List<List<String>> groupAnagrams(String[] strs) {
  3. Map<String, List<String>> map = new HashMap<String, List<String>>();
  4. for (String str : strs) {
  5. char[] array = str.toCharArray();
  6. Arrays.sort(array);
  7. String key = new String(array);
  8. List<String> list = map.getOrDefault(key, new ArrayList<String>());
  9. list.add(str);
  10. map.put(key, list);
  11. }
  12. return new ArrayList<List<String>>(map.values());
  13. }
  14. }

两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。所以每个单词包含的字符数量是一致的,我们使用[LC]49. 字母异位词分组 - 图7保存单词所有字符的次数,作为[LC]49. 字母异位词分组 - 图8[LC]49. 字母异位词分组 - 图9作为 [LC]49. 字母异位词分组 - 图10存储。

我的代码

  1. class Solution {
  2. public List<List<String>> groupAnagrams(String[] strs) {
  3. // map 做 key 统计 str 中各个字符出现的次数,List放入str
  4. // value 是list,所有字符次数一致即一组异位词的放一起
  5. HashMap<HashMap<Character,Integer>,List<String>>map=new HashMap<>();
  6. for(String str:strs){
  7. HashMap<Character,Integer> count=new HashMap<>();
  8. // 统计当前单词所有字符出现的次数
  9. for (int i = 0; i < str.length(); i++) {
  10. count.put(str.charAt(i),count.getOrDefault(str.charAt(i),0)+1);
  11. }
  12. List<String> list=new LinkedList<>();
  13. // 将当前单词添加到异位词组list里
  14. if(map.containsKey(count)){
  15. list=map.get(count);
  16. list.add(str);
  17. map.put(count,list);
  18. }
  19. else{
  20. list.add(str);
  21. map.put(count,list);
  22. }
  23. }
  24. List<List<String>> res=new LinkedList<>();
  25. for(Map.Entry<HashMap<Character,Integer>,List<String>>entry:map.entrySet()){
  26. res.add(entry.getValue());
  27. }
  28. return res;
  29. }
  30. }