当前位置: 首页 > news >正文

LeetCode-049:字母异位词分组,排序后长一样的字符串,本质上就是同一组

一、题目概述

给定一个字符串数组 strs,要求把所有字母异位词归到同一组中,以任意顺序返回分组结果。

什么是字母异位词?就是两个单词由完全相同的字母组成,只是字母的排列顺序不同。比如 "eat""tea",字母都是 eat,只是顺序不一样。

例如:

示例 1

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

输出:

[["bat"],["nat","tan"],["ate","eat","tea"]]

"eat""tea""ate" 这三个词的字母完全一样,归为一组。"tan""nat" 字母一样,归为一组。"bat" 没有异位词伙伴,自己一组。


示例 2

strs = [""]

输出:

[[""]]

示例 3

strs = ["a"]

输出:

[["a"]]

二、这题的核心思路

这道题的关键问题是:怎么快速判断两个字符串是不是字母异位词?

最直接的办法:把它们各自排序

如果两个字符串是字母异位词,那么排序之后,它们一定变成同一个字符串。

"eat" → 排序 → "aet"
"tea" → 排序 → "aet"
"ate" → 排序 → "aet"

三个词排序后都是 "aet",所以它们属于同一组。

"tan" → 排序 → "ant"
"nat" → 排序 → "ant"

排序后都是 "ant",属于同一组。

"bat" → 排序 → "abt"

只有自己,单独一组。

有了这个发现,思路就很清晰了:

用一个哈希表(字典),以排序后的字符串作为 key,把排序结果相同的原始字符串放进同一个列表里。

最后把字典里所有的值取出来,就是分组结果。


三、代码实现

class Solution:def groupAnagrams(self, strs: list[str]) -> list[list[str]]:groups = {}for s in strs:key = ''.join(sorted(s))if key not in groups:groups[key] = []groups[key].append(s)return list(groups.values())

四、逐行拆解代码

1. 创建一个空字典,用来存分组结果

groups = {}

这个字典的结构是:

  • key:排序后的字符串,比如 "aet"
  • value:一个列表,存放所有排序后等于这个 key 的原始字符串

2. 遍历每一个字符串

for s in strs:

逐个拿出输入数组中的字符串来处理。


3. 对当前字符串排序,作为分组的 key

key = ''.join(sorted(s))

sorted(s) 会把字符串 s 拆成字符列表,并按字母顺序排好。比如 sorted("eat") 返回 ['a', 'e', 't']

''.join(...) 再把排序后的字符列表拼回字符串,得到 "aet"

这一步就是整道题的核心:排序后相同的字符串,一定是字母异位词。


4. 如果这个 key 还没出现过,先创建一个空列表

if key not in groups:groups[key] = []

第一次遇到某个排序结果时,需要在字典中为它初始化一个空列表。


5. 把原始字符串加入对应的分组

groups[key].append(s)

不管是不是第一次遇到这个 key,都把当前字符串追加进去。


6. 返回所有分组

return list(groups.values())

groups.values() 返回字典中所有的 value(每个 value 都是一个列表),用 list() 包一下变成列表的列表,就是最终结果。


五、手动模拟

用示例 ["eat","tea","tan","ate","nat","bat"] 走一遍:

步骤 当前字符串 排序后(key) 字典状态
1 "eat" "aet" {"aet": ["eat"]}
2 "tea" "aet" {"aet": ["eat","tea"]}
3 "tan" "ant" {"aet": ["eat","tea"], "ant": ["tan"]}
4 "ate" "aet" {"aet": ["eat","tea","ate"], "ant": ["tan"]}
5 "nat" "ant" {"aet": ["eat","tea","ate"], "ant": ["tan","nat"]}
6 "bat" "abt" {"aet": ["eat","tea","ate"], "ant": ["tan","nat"], "abt": ["bat"]}

最终返回:

[["eat","tea","ate"], ["tan","nat"], ["bat"]]

和预期一致。


六、复杂度分析

时间复杂度:O(n * k * log k)

  • n 是字符串数组的长度(有多少个字符串)
  • k 是字符串的最大长度
  • 对每个字符串做排序需要 O(k log k),一共有 n 个字符串

空间复杂度:O(n * k)

  • 字典中存了所有字符串,总共占用 O(n * k) 的空间

七、用 defaultdict 简化代码

上面代码中 if key not in groups 那一段可以用 Python 的 defaultdict 来省掉:

from collections import defaultdictclass Solution:def groupAnagrams(self, strs: list[str]) -> list[list[str]]:groups = defaultdict(list)for s in strs:key = ''.join(sorted(s))groups[key].append(s)return list(groups.values())

defaultdict(list) 的意思是:当你访问一个不存在的 key 时,它会自动创建一个空列表作为默认值。这样就不需要手动判断 key 是否存在了。

功能完全一样,只是写法更简洁。


八、总结

这道题的核心洞察就一句话:

字母异位词排序后一定相同,所以可以用排序后的字符串作为哈希表的 key 来分组。

整个解法只有三步:

  1. 遍历每个字符串
  2. 对它排序,得到分组的 key
  3. 把原始字符串存进对应 key 的列表里

这题是哈希表分组的经典入门题。它训练的是一个非常重要的思维模式:

当你需要把一堆东西分组时,先想清楚"什么样的东西算同一组",然后找一个能代表这一组的特征值(也就是哈希表的 key)。

在这道题里,"同一组"的定义是字母组成相同,而排序后的字符串就是那个特征值。把这个思路吃透,后面遇到类似的分组题会顺很多。

http://www.jsqmd.com/news/531128/

相关文章:

  • 美团APP竟删照片!客服称“第三方插件”冲突,有博主表示“华为工程师分析日志查到的”
  • 2026年Q3检测站第三方检测用熔体流动速率仪高精度与资质适配性深度评测报告:简支梁冲击试验机/落锤冲击试验机/选择指南 - 优质品牌商家
  • Qwen3.5-4B-Claude-Opus效果展示:JWT令牌签名验证与密钥轮换逻辑推演
  • 优化Ruffle扩展性能:从问题诊断到流畅体验的完整指南
  • 炼精化气:黄庭协议硬件升级的第一关,也是最关键的一关
  • SEO_从零开始,手把手教你制定SEO优化方案(366 )
  • 开箱即用!AnythingtoRealCharacters2511动漫转真人效果惊艳
  • 3个理由让开发者选择OpenCode:开源AI编程助手提升开发效率指南
  • 突破虚拟化限制:VMware macOS环境搭建全指南(开发者专业版)
  • 2026年知名的宝鸡钛棒/工业钛棒源头工厂推荐 - 品牌宣传支持者
  • 智能分割技术重塑三维建模:SAMPart3D如何提升效率与精准度
  • OpenClaw初学者指南:GLM-4.7-Flash模型入门10个问答
  • Qwen3-0.6B-FP8场景应用:快速搭建个人学习助手与创意写作工具
  • XUnity.AutoTranslator深度技术解析:游戏多语言翻译实战指南
  • 2026年热门的法兰头钛螺丝优质供应商推荐 - 品牌宣传支持者
  • 语音去混响技术突破:Nara WPE如何解决真实场景下的语音清晰度难题
  • 3步完成Traggo自托管部署:如何搭建个人时间跟踪系统
  • 误删Anaconda?3步快速恢复指南
  • 我的4GB内存小服务器跑Dify够用吗?实测CentOS7+Docker资源占用与优化指南
  • LeetCode-108:将有序数组转换为二叉搜索树,关键是每次取中间当根
  • 收藏家适用的和田玉专场拍卖优质推荐指南服务诚信权威:和田玉黄口、川料、新疆和田玉籽料、珠宝文玩、籽料碧玉、和田玉俄碧选择指南 - 优质品牌商家
  • REBANG 极简热榜:在信息洪流中,找回阅读的尊严
  • 从零开始:Anaconda环境下InternLM2-Chat-1.8B开发环境搭建
  • 最优化建模算法实践:Goldstein准则在MATLAB中的高效实现与性能对比
  • SEO_2024年最有效的SEO策略与最新趋势解读
  • RWKV7-1.5B-G1A快速部署在Windows:利用WSL2搭建Linux模型运行环境
  • 论文降重工具怎么选?盘点五款神器,硕博必看!
  • NineData 与 Bytebase:面向分析查询的敏感数据脱敏治理场景怎么选?
  • Qwen3.5-4B模型在C语言编程教学中的应用:代码解释与错误调试
  • ChatGPT不同模型选型指南:从GPT-3.5到GPT-4的技术对比与实战建议