Skip to content

383. 赎金信 Easy

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

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

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

示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:
输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:
输入:ransomNote = "aa", magazine = "aab"
输出:true

解题思路

输入:两个字符列表 ransomNotemagazine

输出:判断 ransomNote 能不能由 magazine 里面的字符构成

本题属于 哈希表 问题。

用一个哈希表记录 magazine 的字母出现次数

遍历 ransomNote 时判断哈希表内该字母的次数

如果为 0 或不存在则为 false

都有次数则为 true

代码实现

python
class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        cache = {}
        for ch in magazine:
            cache[ch] = cache.get(ch, 0) + 1  # get 避免手动判断 key 存不存在
        
        for ch in ransomNote:
            if cache.get(ch, 0) == 0:  # 默认值 0,简化判断
                return False
            cache[ch] -= 1
        
        return True
javascript
var canConstruct = function(ransomNote, magazine) {
    const cache = {};

    for (let c of magazine) {
        cache[c] = (cache[c] || 0) + 1;
    }

    for (let c of ransomNote) {
        if (!cache[c]) return false;

        cache[c] -= 1;
    }

    return true;
};

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

链接

383 国际版

383 中文版