LeetCode刷题笔记 49. 字母异位词分组

题目描述

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

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

总结

SDC1:用26个不同的质数表示不同的字母,字符串对应的质数相乘作为 键key
SDC2:把字符串转为char数组,排序转回字符串作为 键key
SDC3:用一个长度26的int数组记录相应位置的字母的数量,如000400301002…000,再把数组转为StringBuilder作为 键key

Sample & Demo Code 1

class Solution {
     
    public List<List<String>> groupAnagrams(String[] strs) {
     
        
        Map<Character, Integer> map = new HashMap<>();
        map.put('a', 2); map.put('b', 3); map.put('c', 5); map.put('d', 7); map.put('e', 11); 
        map.put('f', 13); map.put('g', 17); map.put('h', 19); map.put('i', 23); 
        map.put('j', 29); map.put('k', 31); map.put('l', 37); map.put('m', 41); 
        map.put('n', 43); map.put('o', 47); map.put('p', 53); map.put('q', 59); 
        map.put('r', 61); map.put('s', 67); map.put('t', 71); map.put('u', 73);
        map.put('v', 79); map.put('w', 83); map.put('x', 89); map.put('y', 97); 
        map.put('z', 101);
        
        Map<Integer, List> resMaps = new HashMap<>();
        for(String str : strs) {
     
            int key = 1;
            for(int i = 0; i < str.length(); i++) 
                key *= map.get(str.charAt(i));
            if(!resMaps.containsKey(key)) resMaps.put(key, new ArrayList());
            resMaps.get(key).add(str);
        }
        
        return new ArrayList(resMaps.values());
    }
}

Sample & Demo Code 2

class Solution {
     
    public List<List<String>> groupAnagrams(String[] strs) {
     
        if(strs.length == 0) return new ArrayList();
        Map<String, List> maps = new HashMap<>();
        for(String s : strs) {
     
            char[] cs = s.toCharArray();
            Arrays.sort(cs);
            String key = String.valueOf(cs);
            if (!maps.containsKey(key)) maps.put(key, new ArrayList());
            maps.get(key).add(s);
        }   
        return new ArrayList(maps.values());
    }
}

Sample & Demo Code 3

class Solution {
     
    public List<List<String>> groupAnagrams(String[] strs) {
     
        if (strs.length == 0) return new ArrayList();
        Map<String, List> maps = new HashMap<>();
        int[] count = new int[26];
        for(String s : strs) {
     
            Arrays.fill(count, 0);
            for(char c : s.toCharArray()) count[c-'a']++;
            
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < 26; i++) sb.append(count[i]);
            
            String key = sb.toString();
            if(!maps.containsKey(key)) maps.put(key, new ArrayList());
            maps.get(key).add(s);
        }
        return new ArrayList(maps.values());
    }              
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams

你可能感兴趣的:(LeetCode笔记)