LeetCode49:字母异位词分组

原题地址:49. 字母异位词分组 - 力扣(LeetCode)

题目描述

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

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

示例 1:

输入: strs =["eat", "tea", "tan", "ate", "nat", "bat"]

输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs =[""]

输出: [[""]]

示例 3:

输入: strs =["a"]

输出: [["a"]]

解题思路

题目要求将输入的字符串数组按字母异位词(Anagram)进行分组。字母异位词指的是由相同的字母组成的字符串,但顺序不同。因此,如果两个字符串排序后的结果相同,它们就是字母异位词。

  1. 排序法:对于每个字符串,将其字符排序,然后将排序后的字符串作为键存入哈希表(Map)。字母异位词在排序后会变成相同的字符串,因此,所有字母异位词将会被分配到同一个列表中。
  2. 哈希表存储:使用 Map> 存储每个排序后的字符串和与之对应的字母异位词列表。每个键(String)对应一个值(List),值是所有与该键对应的字母异位词。
  3. 遍历哈希表:遍历哈希表,将每个 List 添加到最终的结果列表 resultList 中。

源码实现

class Solution {
    public List> groupAnagrams(String[] strs) {
        // 存储结果的列表
        List> resultList = new ArrayList<>();

        // 如果输入字符串数组为空或者长度为0,直接返回空结果
        if (strs == null || strs.length == 0) {
            return resultList;
        }

        // 创建一个哈希表,键为排序后的字符串,值为一个存放字母异位词的列表
        Map> cacheMap = new HashMap<>();
        
        // 遍历字符串数组中的每个字符串
        for (String tmp : strs) {
            // 将字符串转换为字符数组
            char[] charArray = tmp.toCharArray();
            // 对字符数组进行排序
            Arrays.sort(charArray);
            // 排序后的字符串作为键
            String dummy = new String(charArray);

            // 如果哈希表中已经有这个键,直接将当前字符串添加到对应的列表中
            if (cacheMap.containsKey(dummy)) {
                cacheMap.get(dummy).add(tmp);
            } else {
                // 如果哈希表中没有该键,创建一个新列表,并将当前字符串添加进去
                List list = new ArrayList<>();
                list.add(tmp);
                cacheMap.put(dummy, list);
            }
        }

        // 遍历哈希表,获取每个字母异位词的列表,并添加到最终的结果列表中
        for (Map.Entry> map : cacheMap.entrySet()) {
            resultList.add(map.getValue());
        }

        // 返回分组后的字母异位词列表
        return resultList;
    }
}

复杂度分析

  • 时间复杂度

    • 遍历每个字符串:O(n),其中 n 是字符串数组的长度。
    • 对每个字符串排序:对于每个字符串 s,排序的时间复杂度是 O(k log k),其中 k 是字符串的长度。
    • 因此,总的时间复杂度是:O(n * k log k),其中 n 是字符串数组的长度,k 是字符串的最大长度。
  • 空间复杂度

    • 使用哈希表来存储排序后的字符串及其对应的字母异位词列表。最坏情况下,所有字符串都不会有字母异位词,则需要存储所有 n 个字符串的分组。空间复杂度为 O(n * k),其中 n 是字符串的数量,k是字符串的最大长度。
    • 另外,resultList 也占用 O(n * k) 的空间,因为它存储所有分组的结果。

你可能感兴趣的:(leetcode,算法,leetcode)