【LeetCode刷题】383. 赎金信

1:题目描述

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

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

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

 2:解题思路

根据题意需要查找数组ransomNote中的元素是否由数组magazine中的元素构成,符合查找一个元素是否在一个数组中,所以我们使用哈希结构-数组。

因为数组ransomNote和数组magazine都是由小写英文字母组成,我们可以定义一个长度为26,初始值全为0的数组res(通过遍历到的元素的ASCII码减去a的ASCII码值,来作为这个元素在res中的下标映射关系),来统计数组ransomNote中元素出现的次数,再减去数组magazine中元素出现的次数。

如果数组res中有元素大于0了,说明数组ransomNote中某个元素比数组magazine中多或不存在于数组magazine中;

如果数组res中的元素全为0,说明数组ransomNote和数组magazine中的元素和出现的次数一致;如果数组res中有元素小于0,说明数组magazine中有的元素,数组ransomNote中没有。

代码展示:

class Solution:
    def canConstruct(self, ransomNote, magazine):
        res = [0] * 26
        for i in range(len(ransomNote)):
            # 使用当前元素的ASCII码减去a的ASCII码,作为当前元素在数组res中的下标的映射关系
            res[ord(ransomNote[i]) - ord("a")] += 1
        for j in range(len(magazine)):
            res[ord(magazine[j]) - ord("a")] -= 1
        for m in range(len(res)):
            if res[m] > 0:
                # 有元素大于0,说明数组ransomNote中出现的元素在数组magazine中没出现或者次数不够
                return False
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值