Leetcode49-字母异位分组详解

往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解

Leetcode24-两两交换链表中的节点详解

Leetcode27-移除元素详解

Leetcode35-搜索插入位置详解


目录

题目

示例

解析

排序法

哈希表

代码

排序法

哈希表


题目

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

字母异位词是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

题目分析

已知:一个字符串数组

目的:将字母异位词组合在一起

要求:返回结果列表(无序)

示例

示例1

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

示例2

输入: strs = [""]
输出: [[""]]

示例3

输入: strs = ["a"]
输出: [["a"]]

解析

排序法

字母异位词的特点是单词中的字母是一样的,每个字母出现次数相同,顺序不同,所以我们可已将每个单词中的字母进行排序,然后将排序后相同的单词归为一类,那么这些单词就是字母异位词。

让我们根据具体示例进行分析

给定字符串数组strs = ["eat", "tea", "tan", "ate", "nat", "bat"],首先让我们对每个字符串进行排序,如果排序后有相同的字符串,则说明他们属于同一祖先。

排序后有相同的字符串,则它们原始对应的单词为字母异位词,将排序后的字符串作为key,将原始字符串作为value,进行归位。

哈希表

除了上面我们所说的字母异位词排序后相同以外,字母异位词还有一个共同点就是他们的字符是相通的,且字母出现次数也是相同的,我们可以分别统计没个单词中字母类型和字母对应的次数,然后根据相同的字母和字母次数来进行归类。

让我们根据具体示例进行分析

给定字符串数组strs = ["eat", "tea", "tan", "ate", "nat", "bat"],首先统计每个单词中的字母和字母次数。

将每个单词对应字母的次数构成一个数组,则数组相同的单词为字母异位词。

 

代码

排序法

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        if len(strs) < 2:
            return [strs]
        result = {}
        for s in strs:
            # sorted排序后输出为列表,将列表转为字符串作为key
            temp = "".join(sorted(s))
            # dict.get(temp, [])表示如果字典中没有键为temp,则返默认的值[]
            #如果字典中存在键temp,则返回temp对应的value
            result[temp] = result.get(temp, []) + [s]
        return list(result.values())

哈希表

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        if len(strs) < 2:
            return [strs]
        result = {}
        for s in strs:
            count_table = [0]*26
            for c in s:
                count_table[ord(c)-ord("a")] += 1
                # 注意列表不能作为哈希表的key,元组可以
                key = tuple(count_table)
                result[key] = result.get(key, []) + [s]
            return list(result.values())

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值