Skip to content

383. 赎金信 Easy ​

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

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

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

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

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

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

解题思路 ​

输入:两个字符列表 ransomNote 和 magazine

输出:判断 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 中文版