在字符
LeetCode链接:242. 有效的字母异位词
1.题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
1 2
| 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
|
示例 2:
1 2
| 输入: strs = [""] 输出: [[""]]
|
示例 3:
1 2
| 输入: strs = ["a"] 输出: [["a"]]
|
提示:
- $1 <= strs.length <= 10^4$
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
2.题解
2.1 排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>(); for (String str : strs) { char[] chs = str.toCharArray(); Arrays.sort(chs); String key = new String(chs); List<String> list = map.getOrDefault(key, new ArrayList<>()); list.add(str); map.put(key, list); }
return new ArrayList<List<String>>(map.values()); } }
|
代码优化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public List<List<String>> groupAnagrams(String[] strs) { return new ArrayList<>(Arrays.stream(strs) .collect(Collectors.groupingBy(str -> { char[] array = str.toCharArray(); Arrays.sort(array); return new String(array); })).values()); } }
class Solution { public List<List<String>> groupAnagrams(String[] strs) { return new ArrayList<>(Arrays.stream(strs).collect(Collectors.groupingBy(str -> str.chars().sorted().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString())).values()); } }
|
2.2 计数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>();
for (String str : strs) { int[] counts = new int[26]; for (int i = 0; i < str.length(); i++) { counts[str.charAt(i) - 'a']++; }
StringBuilder sb = new StringBuilder(); for (int i = 0; i < counts.length; i++) { if (counts[i] != 0) { sb.append((char) ('a' + i)).append(counts[i]); } } String key = sb.toString();
List<String> list = map.getOrDefault(key, new ArrayList<String>()); list.add(str); map.put(key, list); }
return new ArrayList<List<String>>(map.values()); } }
|