给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] | |
输出: [["bat"],["nat","tan"],["ate","eat","tea"]] |
示例 2:
输入: strs = [""] | |
输出: [[""]] |
示例 3:
输入: strs = ["a"] | |
输出: [["a"]] |
提示:
1 <= strs.length <= 104 | |
0 <= strs[i].length <= 100 | |
strs[i] 仅包含小写字母 |
解法一
/** | |
* 排序 | |
* | |
* @param strs | |
* @return | |
*/ | |
public static List<List<String>> groupAnagrams(String[] strs) { | |
Map<String, List<String>> maps = new HashMap<>(); | |
for (String s : strs){ | |
// 将单词中的字母排序,得到一个 key 值 | |
char[] chars = s.toCharArray(); | |
Arrays.sort(chars); | |
String value = Arrays.toString(chars); | |
if (!maps.containsKey(value)){ | |
maps.put(value, new ArrayList<>()); | |
} | |
maps.get(value).add(s); | |
} | |
return new ArrayList<>(maps.values()); | |
// 简写 | |
// return new ArrayList<>(Arrays.stream(strs).collect(Collectors.groupingBy(s -> s.chars().sorted().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString())).values()); | |
} |
解法二
/** | |
* 计数 | |
* | |
* @param strs | |
* @return | |
*/ | |
public static List<List<String>> groupAnagrams(String[] strs) { | |
Map<String, List<String>> maps = new HashMap<>(); | |
for (String s : strs){ | |
int[] count = new int[26]; | |
// 算出每个单词中字母的个数 | |
for (int i = 0; i < s.length(); i++){ | |
count[s.charAt(i) - 'a']++; | |
} | |
// 将单词中字母的数量与字母为 key 值 | |
StringBuilder sb = new StringBuilder(); | |
for (int i = 0; i < 26; i++){ | |
if (count[i] != 0) sb.append(count[i]).append((char) 'a' + i); | |
} | |
String key = sb.toString(); | |
maps.putIfAbsent(key, new ArrayList<>()); | |
maps.get(key).add(s); | |
} | |
return new ArrayList<>(maps.values()); | |
} |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams