(day21)leecode hot100字母异位词分组

描述

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

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

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

思想:对于相同字母排列组合形成的字符串用sorted方法就变成一致啦;

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        table = {}  # 初始化一个空字典,用于存储变位词组
        for s in strs:  # 遍历输入的字符串列表
            s_ = ''.join(sorted(s))  # 对字符串进行排序,并将排序后的字符连接成一个新的字符串
            if s_ not in table:  # 如果排序后的字符串不在字典中
                table[s_] = [s]  # 将排序后的字符串作为键,并将原始字符串放入列表中作为值
            else:
                table[s_].append(s)  # 如果排序后的字符串已经在字典中,则将原始字符串添加到对应的列表中
            # table[s_] = table[s_] + [s] if s_ in table else [s]
            # 上面的if-else语句可以直接用以上语句代替
        return list(table.values())  # 返回字典中所有值的列表,即变位词分组的列表

这段代码利用哈希表将输入字符串按变位词分组。通过对每个字符串进行排序作为键,可以快速将变位词归为一组,最终返回所有分组结果。 

  • 初始化一个空字典: 创建一个空的哈希表(字典)来存储分组结果。字典的键是经过排序的字符串,值是包含这些字符的原始字符串的列表。

  • 遍历输入字符串列表: 遍历每个输入的字符串。

  • 排序字符串: 对当前字符串进行排序,将排序后的字符串作为字典的键。这一步确保了所有变位词具有相同的键,因为变位词排序后结果是相同的。

  • 将字符串添加到字典:

    • 如果排序后的字符串不在字典中,创建一个新的键值对。键是排序后的字符串,值是一个包含当前字符串的列表。
    • 如果排序后的字符串已经在字典中,将当前字符串添加到对应的列表中。
  • 返回分组结果: 遍历完所有字符串后,字典的值部分即为变位词的分组结果。将这些值转换为列表并返回。

from collections import defaultdict  # 从 collections 模块中导入 defaultdict

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        d = defaultdict(list)  # 初始化一个 defaultdict,默认值为空列表,用于存储变位词组
        for s in strs:  # 遍历输入的字符串列表
            d[''.join(sorted(s))].append(s)  # 对字符串进行排序,并将其加入排序后的字符串对应的列表中
        return list(d.values())  # 返回字典中所有值的列表,即变位词分组的列表

初始化一个空的 defaultdict,我们称之为 d。

遍历输入字符串数组 strs: 对于第一个字符串 "eat",排序后为 "aet",将它加入到键为 "aet" 的列表中。 对于第二个字符串 "tea",排序后也为 "aet",因此也加入到键为 "aet" 的列表中。 对于第三个字符串 "tan",排序后为 "ant",将它加入到键为 "ant" 的列表中。 对于第四个字符串 "ate",排序后为 "aet",同样加入到键为 "aet" 的列表中。 对于第五个字符串 "nat",排序后为 "ant",同样加入到键为 "ant" 的列表中。 对于最后一个字符串 "bat",排序后为 "abt",将它加入到键为 "abt" 的列表中。

 最终,我们得到的 d 字典如下所示: { 'aet': ['eat', 'tea', 'ate'], 'ant': ['tan', 'nat'], 'abt': ['bat'] } 将 d 字典的所有值转换为列表并返回,即 [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]。 

defaultdict函数 

defaultdict 是 Python 标准库 collections 模块中的一个类,它扩展了普通字典(dict)的功能。默认字典的功能与dict基本相同,但在访问一个不存在的key时,默认字典会提供一个默认值,而不是引发异常。

创建不同类型的默认字典。

    默认字典的构造函数接受一个工厂函数default_factory作为参数,可以将一个类型名看做是一个工厂函数,比如list,tuple,str等。

这个函数会在要生成默认值的时候无参调用,如果使用类型名作为工厂函数,则这个类型必须要有无参构造函数, 比如

import collections


def GetIntdd():
    dd = collections.defaultdict(int)
    print(dd)


def GetListdd():
    dd = collections.defaultdict(list)
    print(dd)


def GetTupledd():
    dd = collections.defaultdict(tuple)
    print(dd)


def GetStrdd():
    dd = collections.defaultdict(str)
    print(dd)


for func_name in [
    f for f in globals() if callable(globals().get(f)) and f.startswith("Get")]:
    globals()[func_name]()

结果如下:

defaultdict(<class 'int'>, {})                     
defaultdict(<class 'list'>, {})
defaultdict(<class 'tuple'>, {})
defaultdict(<class 'str'>, {})

若 print(dd)改为print(dd['a']),则结果为

0
[]
()

   (此处为空字符串)

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值