字母异位词-字典之defaultdict哈希表

本文介绍了如何使用Python解决LeetCode242题,判断两个字符串是否为字母异位词。首先提到使用哈希表的方法,然后优化为使用defaultdict避免try-except异常,最后对比了两种方法的空间复杂度。
摘要由CSDN通过智能技术生成

leetcode242

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

容易想到哈希表

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        hash_dic = dict()
        for letter in s:
            if letter in hash_dic.keys():
                hash_dic[letter] += 1
            else:
                hash_dic[letter] = 1

        try:
            for letter in t:
                hash_dic[letter] -= 1
        except KeyError:
            return False

        for key in hash_dic.keys():
            if hash_dic[key] != 0:
                return False
        return True

在进行第二次循环,即字符串t的循环过程中,考虑到t中的字母可能没有在s中出现过,因此写一个try-except代码块(开始写代码时错误类型还记错了:写的是ValueError,结果报错是KeyError)。这样不是很方便,因此查阅了资料,了解了一种新的字典数据类型defaultdict,顾名思义,与普通的字典不同,defaultdict可以在初始化时指定一个默认值类型,并在访问不存在的键时返回该默认值,而不会引发KeyError异常。

当访问一个不存在的键时,defaultdict会自动调用这个可调用对象来生成默认值,并将其关联到相应的键上。

# 创建一个defaultdict,默认值为int类型的0
scores = defaultdict(int)

 因此上边代码可以改为使用defaultdict数据类型,而不必使用try-except代码块。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        hash_dic = defaultdict(int)
        for letter in s:
            if letter in hash_dic.keys():
                hash_dic[letter] += 1
            else:
                hash_dic[letter] = 1

        for letter in t:
            hash_dic[letter] -= 1

        for key in hash_dic.keys():
            if hash_dic[key] != 0:
                return False
        return True

发现了一个更为简洁的版本:但是使用了两个字典,空间复杂度要高一点

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        dic1 = defaultdict(int)
        dic2 = defaultdict(int)
        for letter in s:
            dic1[item] += 1
        for letter in t:
            dic2[item] += 1
        return dic1 == dic2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值