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;
}
}
|