Loading...

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 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