package hash; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; /** * 题目:49.字母异位词分组 (groupAnagrams) * 描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 * 链接:https://leetcode.cn/problems/group-anagrams * 示例 1: 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 示例 2: 输入: strs = [""] 输出: [[""]] 示例 3: 输入: strs = ["a"] 输出: [["a"]] */ //做出来了。 public class GroupAnagrams { //计数 public List> groupAnagrams1(String[] strs) { // 创建一个 Map,键是编码后的字符串,值是字母异位词列表 HashMap> map = new HashMap<>(); // 遍历输入数组 for (String str : strs) { // 统计每个字母出现的次数 int[] count = new int[26]; for (char c : str.toCharArray()) { count[c - 'a']++; // 统计字母出现次数 } // 将字母统计结果编码为字符串 StringBuilder sb = new StringBuilder(); for (int i = 0; i < 26; i++) { sb.append('#'); //必须加 [bdddddddddd, bbbbbbbbbbc] 都是01010... 01010... sb.append(count[i]); } String key = sb.toString(); // 如果 Map 中不存在该键,则创建一个新的列表 if (!map.containsKey(key)) { map.put(key, new ArrayList<>()); } // 将当前单词添加到对应的列表中 map.get(key).add(str); } // 返回 Map 中的所有值(即字母异位词列表) return new ArrayList<>(map.values()); } //排序 public List> groupAnagrams(String[] strs) { // 创建一个 Map,键是标准化后的字符串,值是字母异位词列表 HashMap> map = new HashMap<>(); // 遍历输入数组 for (String str : strs) { // 将单词转换为字符数组并排序 char[] charArray = str.toCharArray(); Arrays.sort(charArray); String sortedStr = new String(charArray); // 如果 Map 中不存在该键,则创建一个新的列表 if (!map.containsKey(sortedStr)) { map.put(sortedStr, new ArrayList<>()); } // 将当前单词添加到对应的列表中 map.get(sortedStr).add(str); } // 返回 Map 中的所有值(即字母异位词列表) return new ArrayList<>(map.values()); } }