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

空间复杂度:On
在这里插入图片描述

解法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

空间复杂度:On
在这里插入图片描述

解法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

空间复杂度:On
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38783664/article/details/111351450
今日推荐