LeetCode49 字母异位词分组

时间:2021-07-21
本文章向大家介绍LeetCode49 字母异位词分组,主要包括LeetCode49 字母异位词分组使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目

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

字母异位词指字母相同,但排列不同的字符串。

 示例 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] 仅包含小写字母 

方法

本题解题思路都是用hashmap为存储,必须用String为key保存

排序法

首先将每个字符串排序,查询排序后的字符串是否存在map中

  • 时间复杂度:O(nklogk),n为字符串个数,k为字符串的长度,排序需要nlogn
  • 空间复杂度:O(nk)
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for(String str:strs){
            char[] c = str.toCharArray();
            Arrays.sort(c);
            String key = String.valueOf(c);
            if(map.containsKey(key)){
                map.get(key).add(str);
            }else{
                List<String> value = new ArrayList<>();
                value.add(str);
                map.put(key,value);
            }
        }
        List<List<String>> result = new ArrayList<>();
        for(List<String> value:map.values()){
            result.add(value);
        }
        return result;
    }
}

计数法

首先把每个字符串的所有字符存入对应数组下标,然后再拼成字符串

  • 时间复杂度:O(n*k),n为字符串的个数,m为最长字符串的长度
  • 空间复杂度:O(n(k+∣Σ∣)),其中 nn 是字符串的数量,k是字符串的最大长度,Σ是字符集即26

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/group-anagrams/solution/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
       Map<String,List<String>> map = new HashMap<>();
       for(String str:strs){
           int[] ch = new int[26];
           for(int i=0;i<str.length();i++){
               ch[str.charAt(i)-'a'] ++;
           }
           StringBuffer strBuf = new StringBuffer();
           for(int i=0;i<26;i++){
               if(ch[i]!=0){
                   strBuf.append('a'+i);
                   strBuf.append(ch[i]);
               }
           }
           String key = strBuf.toString();
           List<String> value = map.getOrDefault(key,new ArrayList<>());
           value.add(str);
           map.put(key,value);
       }
       return new ArrayList<List<String>>(map.values());
    }
}

原文地址:https://www.cnblogs.com/ermiao-zy/p/15038609.html