Given an array of strings, group anagrams together.

Example:

1
2
3
4
5
6
7
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Note:

  • All inputs will be in lowercase.
  • The order of your output does not matter.

Solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        
        int[] c = new int[26];
        for (String s : strs) {
            Arrays.fill(c, 0);
            for (int i = 0 ; i < s.length(); i++) {
                c[s.charAt(i) - 'a']++;
            }
            
            String code = Arrays.toString(c);
            
            List<String> list = map.get(code);
            if (list == null) {
                list = new ArrayList<>();
            } 
            list.add(s);
            map.put(code, list);
        }
        return new ArrayList<>(map.values());
    }
}

Solution 2021-11-15

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> keyToList = new HashMap<>();
        
        for (String s: strs) {
            char[] charString = s.toCharArray();
            Arrays.sort(charString);
            
            String sortedWord = String.valueOf(charString);
            
            List<String> anagrams = keyToList.getOrDefault(sortedWord, new ArrayList<>());
            anagrams.add(s);
            keyToList.put(sortedWord, anagrams);
        }
        
        List<List<String>> res = new ArrayList<>();
        
        for (var anagrams: keyToList.values()) {
            res.add(anagrams);
        }
        return res;
    }
}