LeetCode 热题 100第二题:字母易位词分组python版本

第一部分:题目信息

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

示例 1:

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

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

解释:

  • 在 strs 中没有字符串可以通过重新排列来形成 "bat"。
  • 字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
  • 字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入: strs = ""

输出:\[""]

示例 3:

输入: strs = "a"

输出:\["a"]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

第二部分:代码实现

讲解如下:

第一步:对原始列表中的每个字符串进行字母排序,生成排序后字符串列表

核心目的 :为每个原始字符串生成一个 "特征标识"(字母排序后的字符串),后续通过这个特征标识判断哪些原始字符串是同类(比如eat、tea排序后都是aet,说明它们是同类)。

复制代码
#第一步:重新排序
str_sort=[]
for in_str in strs:
    first = in_str
    list_first = list(first)
    list_first_sort = sorted(list_first)
    first_sort = ''.join(list_first_sort)
    str_sort.append(first_sort)
print(str_sort)

第二步:通过集合去重,获取同类字符串的类别数量(count)

核心目的 :统计有多少组不同的字符串(即最终二维列表有多少个内层列表),set 集合的 "元素唯一性" 可自动剔除 str_sort 中的重复特征,长度即为类别数。

复制代码
#第二步:得到相同元素的类别数量count(set集合自动去重)
str_sort_set=set(str_sort)
count=len(str_sort_set)

第三步:创建一个包含 count 个空列表的二维列表(str_count)

核心目的 :提前搭建归类的 "容器",准备好 count 个空的内层列表,后续将同类的原始字符串存入对应的空列表中。

复制代码
#第三步:得到count个归类的数组,双层list
str_count=[]
for i in range(count):
    str_count.append([])

第四步:按 "排序特征" 匹配,将原始字符串归类到对应内层列表中

核心目的:通过 "排序特征" 的匹配,把原始字符串存入对应的内层列表,完成最终归类,这是代码的核心业务逻辑。

复制代码
#第四步:开始存放元素到指定位置
count_index=0
for target in str_sort_set:
    for j in range(len(str_sort)):
        if(str_sort[j]==target):
            str_count[count_index].append(strs[j])
    count_index=count_index+1
print(str_count)

完整代码:

复制代码
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        #第一步:重新排序
        str_sort=[]
        for in_str in strs:
            first = in_str
            list_first = list(first)
            list_first_sort = sorted(list_first)
            first_sort = ''.join(list_first_sort)
            str_sort.append(first_sort)
        print(str_sort)
        #第二步:得到相同元素的类别数量count(set集合自动去重)
        str_sort_set=set(str_sort)
        count=len(str_sort_set)

        #第三步:得到count个归类的数组,双层list
        str_count=[]
        for i in range(count):
            str_count.append([])
        #第四步:开始存放元素到指定位置
        count_index=0
        for target in str_sort_set:
            for j in range(len(str_sort)):
                if(str_sort[j]==target):
                    str_count[count_index].append(strs[j])
            count_index=count_index+1
        return str_count
相关推荐
Nuanyt1 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
Android系统攻城狮2 小时前
Linux FFmpeg深度解析之avcodec_default_get_encode_buffer调用流程与实战(二十八)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频
程序员初一2 小时前
8080 打不开的四层定位:监听地址、ufw、DOCKER 链、安全组
linux·ssh
程序开发阿元2 小时前
swappiness 60 和 10 差在哪:一台 1C1G 的三轮对比
linux·ssh
无足鸟ICT2 小时前
【RHCA+】mpstat命令(监控CPU)
linux
GeW3 小时前
新质生产力Linux和数据库为啥这么关键
linux
武天旭4 小时前
AI安全--AI大模型的毒性偏见与安全对齐实践
人工智能·python·深度学习
番茄啊4 小时前
linux 开启xftp连接
linux·运维·服务器
CodeYp20194 小时前
第1讲:Linux 基础指令
linux·指令
圣保罗的大教堂5 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode