力扣热题100之字母异位词分组

题目如下:

解题思路:

  • 目标

    • 给定一组字符串,将字母相同但顺序不同的字符串放到一起。比如 "eat""tea" 就是字母异位词(anagram),因为它们用的是相同的字母。
  • 步骤解释

    • 创建 HashMapMap<String, List<String>> map = new HashMap<>() 创建了一个字典(类似于单词本)。字典的**每个键(key)**将是字符串的"排序后版本"。比如 "eat" 排序后变成 "aet",所有字母异位词都会有相同的键。

    • 遍历字符串for (String str : strs) 遍历输入的每个字符串,比如 "eat""tea"

    • 字符排序char[] array = str.toCharArray(); Arrays.sort(array); 将字符串变成字符数组,然后对字符排序。排序后,像 "eat" 会变成 "aet",这样方便将它和其他字母异位词归到同一个组里。

    • 存储结果:检查排序后的字符串是不是已经在 map 里面了。如果不在,先创建一个新的空列表来存储原始字符串;如果在,就直接把当前字符串加入到这个列表中。

    • 返回结果:最后,将 map 里面所有的值(就是每个分组的字符串列表)收集起来,作为结果返回。

代码如下:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 创建一个 HashMap 来存储分组结果
        Map<String, List<String>> map = new HashMap<>();

        // 遍历每一个字符串
        for (String str : strs) {
            // 将字符串转换为字符数组
            char[] array = str.toCharArray();
            // 对字符数组进行排序
            Arrays.sort(array);
            // 将排序后的字符数组转换回字符串作为 key
            String sortedStr = new String(array);

            // 如果 map 中还没有这个 key,先创建一个空列表
            if (!map.containsKey(sortedStr)) {
                map.put(sortedStr, new ArrayList<>());
            }

            // 把原始字符串加入到对应的列表中
            map.get(sortedStr).add(str);
        }

        // 返回所有的分组(map 的 values 是每个 key 对应的列表)
        return new ArrayList<>(map.values());
    }
}