LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】

题目描述:

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

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

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

解题思路一:哈希表和排序,这里最关键的点是,乱序单词的排序结果必然是一样的(从而构成哈希表的key)。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        res = []
        mapping = {}
        for s in strs:
            key = str(sorted(s))
            mapping[key] = mapping.get(key, []) + [s]
        for key, value in mapping.items():
            res.append(value)
        return res

时间复杂度:O(n)
空间复杂度:O(n)

解题思路二:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        table = collections.defaultdict(list)
        for s in strs:
            key = "".join(sorted(s))
            table[key].append(s)
        return list(table.values())

时间复杂度:O(nk logk)
空间复杂度:O(nk) 其中 n 是strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。

解题思路三:用字符计数数组作为哈希表的key。注意将数组转为tuple因为数组不可作为哈希表的key。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        mp = collections.defaultdict(list)

        for st in strs:
            counts = [0] * 26
            for ch in st:
                counts[ord(ch) - ord("a")] += 1
            # 需要将 list 转换成 tuple 才能进行哈希
            mp[tuple(counts)].append(st)
        
        return list(mp.values())

时间复杂度:O(nk)
空间复杂度:O(nk)

相关推荐

  1. Golang leetcode242有效字符 map 排序

    2024-03-29 22:24:02       51 阅读
  2. 每日OJ题_⑤_力扣49. 字母分组

    2024-03-29 22:24:02       49 阅读
  3. 字母分组

    2024-03-29 22:24:02       66 阅读
  4. LeetCode 49 字母分组

    2024-03-29 22:24:02       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 22:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 22:24:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 22:24:02       82 阅读
  4. Python语言-面向对象

    2024-03-29 22:24:02       91 阅读

热门阅读

  1. nginx符号链接介绍

    2024-03-29 22:24:02       34 阅读
  2. 【WPF应用22】WPF 中的 PasswordBox 控件详解

    2024-03-29 22:24:02       37 阅读
  3. LEETCODE-DAY36

    2024-03-29 22:24:02       39 阅读
  4. 1.7.1 python 作业 15道

    2024-03-29 22:24:02       45 阅读
  5. 什么是 Kylin Cube?

    2024-03-29 22:24:02       43 阅读
  6. iOS library not found for -lMBProgressHUD

    2024-03-29 22:24:02       43 阅读
  7. Android WebView的使用与后退键处理

    2024-03-29 22:24:02       44 阅读
  8. Unity中控制帧率的思考

    2024-03-29 22:24:02       44 阅读
  9. 用conda和pip隔离Python环境

    2024-03-29 22:24:02       44 阅读
  10. 使用Shell脚本进行MySql权限修改

    2024-03-29 22:24:02       47 阅读