创见博客
赎金信
七崽爱吃小饼干2026/01/04阅读 0专栏 算法合集

赎金信

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

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

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

示例 1:

codeType
输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

codeType
输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

codeType
输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNote 和 magazine 由小写英文字母组成

解法

ts
function canConstruct(ransomNote: string, magazine: string): boolean {
    /**
        这题涉及到的查找操作比较多,可以用hashmap简化查找操作
        charMap用来记录magazine的每个字符的数量
     */
    const n = ransomNote.length
    const m = magazine.length
    if(m < n) return false
    const charMap = new Map<string, number>()
    for(let i = 0; i < m; i++){ // 初始化
        const curCh = magazine[i]
        if(charMap.has(curCh)){
            charMap.set(curCh, charMap.get(curCh) + 1)
        }else{
            charMap.set(curCh, 1)
        }
    }
    for(let i = 0; i < n; i++){
        const ch = ransomNote[i]
        if(charMap.has(ch)){
            let count = charMap.get(ch)
            if(count === 0) return false
            charMap.set(ch, count - 1)
        }else{
            return false
        }
    }
    return true

};
评论
0/100