49.文字の不快なグループ化(Javaで実装)-LeetCode

トピック:

文字列の配列が与えられた場合、文字失読症を組み合わせます。脂肪族の単語は、同じ文字で配置が異なる文字列を指します。

例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

説明:

  • すべてのエントリは小文字です。
  • 回答が出力される順序は考慮されません。

解決策1:並べ替え

/**
 * 思路:
 * 创建map和set
 * map中k是排序后的字符串,v是对应的List对象
 * 遍历字符串数组
 * 将字符串排序,判断是否在map中,在就在到对应的map的v中加入String。不在就创建List,并添加到map
 * 最后组装map中的所有v返回
 */
     public List<List<String>> groupAnagrams(String[] strs) {
    
    
        List<List<String>> result = new ArrayList<>();
        HashMap<String, List<String>> map = new HashMap<>();
        for (String s:strs){
    
    
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String sort_s = new String(chars);
            if (map.containsKey(sort_s)){
    
    
                List<String> list = map.get(sort_s);
                list.add(s);
            }else {
    
    
                List<String> list = new ArrayList<>();
                list.add(s);
                map.put(sort_s,list);
            }
        }
        for (List<String> list:map.values())result.add(list);
        return result;
    }

時間計算量:Onlogn

スペースの複雑さ:オン
ここに画像の説明を挿入

解決策2:カウント

/**
 * 思路:
 * 遍历字符串数组
 * 每次都创建一个26长度的数组,记录当前字符串的字符个数
 * 记录每个字符串字母+出现次数(a1b2),如果能和map中的key对上的就是异位数,存在当前map的v中
 */
     public List<List<String>> groupAnagrams(String[] strs) {
    
    
        HashMap<String, List<String>> map = new HashMap<>();
        for (String s:strs){
    
    
            int[] arr = new int[26];
            char[] chars = s.toCharArray();
            for (char c:chars){
    
    
                arr[c-'a']++;
            }
            StringBuilder sb = new StringBuilder();
            for (int i=0;i<arr.length;i++){
    
    
                if (arr[i]!=0) {
    
    
                   sb.append(i+'a');
                   sb.append(arr[i]);
                }
            }
            List<String> list = map.getOrDefault(sb.toString(), new ArrayList<>());
            list.add(s);
            map.put(sb.toString(),list);
        }
        return new ArrayList<List<String>>(map.values());
    }

時間計算量:On ^ 2

スペースの複雑さ:オン
ここに画像の説明を挿入

解決策3:素数

/**
 * 思路:
 * 给每个字母对应一个质数
 * 遍历字符串数组,每个字符串的字符对照质数数组
 * 把所有质数的乘积作为map的key(因为是质数可以保证不会出现不同位置乘起来结果一样)
 */
     public List<List<String>> groupAnagrams(String[] strs) {
    
    
        HashMap<Long, List<String>> map = new HashMap<>();
        //每个字母对应一个质数,26
        int[] prime = {
    
     2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103 };
        for (String s:strs){
    
    
            long mapping=1;
            char[] chars = s.toCharArray();
            for (char c:chars){
    
    
                mapping*=prime[c-'a'];
            }
            List<String> list = map.getOrDefault(mapping, new ArrayList<String>());
            list.add(s);
            map.put(mapping,list);
        }
        return new ArrayList<>(map.values());
    }

時間計算量:On ^ 2

スペースの複雑さ:オン
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_38783664/article/details/111351450