hash表-赎金信

Problem: 383. 赎金信

思路

该题可以通过hash表记录两个字符串中各字符出现次数,再比较各个键上杂志对应的值是否大于勒索信对应的值。为加速比较,可以采用同一个hash表来记录各个字符出现次数差。

解题方法

由于字符都是小写英文字符,所以可以定义一个长度为26的数组A记录每个字符出现的次数差(若样本都是简单的样本,以字典形式记录消耗空间更少)。先遍历杂志的每个字符,将a-z中各字符出现的次数记录在A的0-25位置上(即a对应位置0,b对应位置1);再遍历勒索信,若字符char出现一次,则A对应char位置上的次数减一,这里char代指a-z中的任一字符;若遍历勒索信时发现某一字符对应的次数小于0表示,杂志中该字符出现次数小于勒索信中,输出false, 否则输出true。

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( 1 ) O(1) O(1)

Code

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        d = [0]*26
        for s in magazine:
            i = ord(s) - ord('a')
            d[i] += 1
        
        for s in ransomNote:
            i = ord(s) - ord('a')
            d[i] -= 1
            if d[i] <0:
                return False
        return True
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值