Leetcode热题100 | Pro2 [49. 字母异位词分组]

106 阅读2分钟

题目:

链接:leetcode.cn/problems/lo…

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 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] 仅包含小写字母

代码

class Solution2 {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> data = new HashMap<>();
        for(String str : strs){
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            if(data.containsKey(key)){
                data.get(key).add(str);
            }else {
                List<String> list = new ArrayList<>();
                list.add(str);
                data.put(key,list);
            }
        }
        return new ArrayList<>(data.values());
    }
}

代码解读:

这是一个 Java 语言编写的函数,其功能是将输入的字符串数组 strs 进行分组。分组的依据是字符串的字母组成,即字母组成相同的字符串被归为一组。

  • groupAnagrams 函数首先创建一个 HashMap 对象 data,用于存储分组后的结果。键是排序后的字符串,值是该字符串的所有原始字符串的列表。
  • 通过对 strs 数组进行遍历,对于每个字符串 str,先将其字符数组化,然后使用 Arrays.sort 方法对字符数组进行排序,得到一个新的字符串 key
  • 若 key 已经存在于 data 中,意味着之前已经有相同字母组成的字符串被添加过,直接将当前字符串 str 添加到对应的列表中。
  • 若 key 不在 data 中,则创建一个新的列表,将 str 添加进去,并将其作为键值对插入到 data 中。
  • 遍历结束后,data 中的每个键值对表示了一组字母相同的字符串。最后,使用 new ArrayList<>(data.values()) 将所有的值(即字符串列表)提取出来,返回一个包含了所有分组的字符串列表的列表。

总的来说,这段代码是一个分组算法的实现,通过排序后的字符串作为键,可以高效地对字符串数组进行分组。