對anagrams分組 Group Anagrams

問題:數組

Given an array of strings, group anagrams together.spa

For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
Return:code

[
  ["ate", "eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Note: 
For the return value, each inner list’s elements must follow the lexicographic order. (字典排序)
All inputs will be in lower-case.排序

解決:element

① 把字符串中的字符排序後,若都相等則爲同一組,使用map對其進行分類。字符串

public class Solution { //47ms
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0)
            return new ArrayList<>();
        // 此排序是爲了讓每一個List<String>的結果按照字典序輸出
        // 可是並不須要,此題沒要求
        Arrays.sort(strs);

        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] schar = str.toCharArray();
            // 將char數組按照字典順序排序
            Arrays.sort(schar);

            String sortStr = String.valueOf(schar);
            // 排序後的String做爲key,
            if (!map.containsKey(sortStr))
                map.put(sortStr, new ArrayList<>());
            map.get(sortStr).add(str);
        }
        // 注意ArrayList的構造方法的應用
        return new ArrayList<>(map.values());
    }
}get

② 在discuss中看到,使用hash table對字符進行排序,使用map對字符相同的單詞進行分類。input

public class Solution { //27ms
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for(String str : strs){
            char[] arr = new char[26];
            for(char c : str.toCharArray()){
                arr[c - 'a']++;
            }
            String key = new String(arr);
            List<String> list = map.getOrDefault(key, new ArrayList<>());
            list.add(str);
            map.put(key, list);
        }
        res.addAll(map.values());
        return res;
    }
}string

③ hash

class Solution { // 21ms
    public List<List<String>> groupAnagrams(String[] strs) {
        int[] prime = {
            2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
            31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 
            73, 79, 83, 89, 97, 101
        }; //26個,用來表示字符
        List<List<String>> res = new ArrayList<List<String>>();
        HashMap<Integer, List<String>> map = new HashMap<>();
        for (String s : strs) {
            int key = 1;
            for (char c : s.toCharArray()) {
                key *= prime[c - 'a'];                 }             if (! map.containsKey(key)) {                 List<String> tmp = new ArrayList<>();                 tmp.add(s);                 res.add(tmp);                 map.put(key, tmp);             } else {                 List<String> tmp = map.get(key);                 tmp.add(s);             }         }         return res;     } }

相關文章
相關標籤/搜索