383. 赎金信 python

文章讨论了一种Python字符串匹配问题,即判断ransomNote字符串能否由magazine字符串中的字符构成。文中提出了两种解决方案:一是使用defaultdict避免KeyError,二是利用collections.Counter进行词频统计。通过这些数据结构优化,可以更高效地检查ransomNote是否能由magazine构建,并返回结果。
摘要由CSDN通过智能技术生成

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        hash_abc = [0] * 26
        for i in range(len(magazine)):
            hash_abc[ord(magazine[i]) - ord('a')] += 1
        for i in range(len(ransomNote)):
            if hash_abc[ord(ransomNote[i]) - ord('a')] == 0:
                return False
            else:
                hash_abc[ord(ransomNote[i]) - ord('a')] -= 1
        return True

看代码随想录文章后新增知识:

之前在使用字典的时候, 用的比较随意, 只是简单的使用dict.
然而这样在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登场了.

1

2

from collections import defaultdict

d1 = defaultdict(int)

使用defaultdict任何未定义的key都会默认返回一个根据method_factory参数不同的默认值, 而相同情况下dict()会返回KeyError.

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:

        from collections import defaultdict

        hashmap = defaultdict(int)

        for x in magazine:
            hashmap[x] += 1

        for x in ransomNote:
            value = hashmap.get(x) #读取dict中value
            if value is None or value == 0:
                return False
            else:
                hashmap[x] -= 1

        return True

另外还有counter:

有了这个函数就不用手动的使用 for 循环来手动统计词频啦!

Counter() 是 collections 库中的一个函数,可以用来统计一个 python 列表、字符串、元组等可迭代对象中每个元素出现的次数,并返回一个字典
nums = [1, 1, 1, 6, 6, 6, 7, 8]
count = Counter(nums) 
for k, v in count.items():
    print(k, v)

使用 Counter 统计完词频后可以使用 most_common 方法来查找出现频率最高的 k 个数字及其出现次数。

ansdict = count.most_common(2) # 返回出现次数最多的两个数及其出现的次数 如[(1, 3), (6, 3)]

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        c1 = collections.Counter(ransomNote)
        c2 = collections.Counter(magazine)
        x = c1 - c2
        #x只保留值大于0的符号,当c1里面的符号个数小于c2时,不会被保留
        #所以x只保留下了magazine不能表达的
        if(len(x)==0):
            return True
        else:
            return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值