力扣链接:49. 字母异位词分组,难度等级:中等。
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
约束:
1 <= strs.length <= 10^40 <= strs[i].length <= 100strs[i]仅包含小写字母
思路
站长 (张健): 👋
大家好!我是张健。
我深知学习算法和找到好工作之间的挑战。因此,除了这个项目,我个人还开发了
leader.me
— 这是程序员打造个人IP的终极平台,包含作品集、简历和博客等。
🚀 掌握算法是基础,而 leader.me 助您完美展示技能,顺利拿到 Offer!
立即前往 leader.me 打造你的程序员专属个人IP →
两个字符串,
bat和atb,用什么方法能最快地知道他们是字母异位词呢?点击查看答案
将每个字符串都按字母表顺序排序,然后比较排过序的两个字符串。相等,就是。
但是排序后,原字符串没有被考虑进来,而结果求的是原字符串的分组。如何解决?
点击查看答案
用元组,即把按字母表顺序排序后的字符串和原字符串放在一个元组里,像这样:
("abt", "bat")。剩下要做的,就是对这个元组数组进行分组了。如何分组最简单?
点击查看答案
用
Map,key是按字母表顺序排过序的字符串,value是原字符串的数组。
复杂度
时间复杂度
O(N * M * logM)
空间复杂度
O(N)
解释
M = string.length
Python #
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
pairs = [(''.join(sorted(string)), string) for string in strs]
ordered_to_original = defaultdict(list)
for ordered, original in pairs:
ordered_to_original[ordered].append(original)
return list(ordered_to_original.values())
Ruby #
# @param {String[]} strs
# @return {String[][]}
def group_anagrams(strs)
result = Hash.new([])
strs.each do |str|
result[str.chars.sort.join] += [str]
end
result.values
end
# Or solution 2: More concise way
# @param {String[]} strs
# @return {String[][]}
def group_anagrams(strs)
strs.group_by { |string| string.chars.sort }.values
end
其它语言
欢迎贡献代码到 LeetCode.blog GitHub -> 49. 字母异位词分组。感谢!打造你的开发者个人IP
🚀 掌握算法是成功的基石,而全方位展示你的才华则是获得垂青的关键。
我的另一个项目 leader.me —— 专为程序员打造的“全能型”个人品牌展示平台。三位一体(All-In-One)的职场利器:
- 📄 简历 + 作品集 + 博客: 将你的 GitHub 项目、技术心得与职场经历完美融合。
- 🌐 永久免费自定义域名: 支持绑定你自己的独立域名,且该功能永久免费。
- ✨ 顶级行业子域名: 提供
name.leader.me—— 极具职业含金量的专属域名。