【leetcode】383. 赎金信

48 阅读1分钟

leetcode-383.png

这一题比较简单,使用一个map来计数即可解决
先遍历magazine里面的字符放入map中进行计数,再遍历ransomNote的字符,进行减数
如果某个计数小于0,或者不存在的时候,返回false
遍历完了,返回true

使用map

var canConstruct = function (ransomNote, magazine) {
    let map = new Map()
    for (let i = 0; i < magazine.length; ++i) {
        if (map.has(magazine[i])) {
            map.set(magazine[i], map.get(magazine[i]) + 1)
        } else {
            map.set(magazine[i], 1)
        }
    }
    for (let i = 0; i < ransomNote.length; ++i) {
        if (map.has(ransomNote[i])) {
            let cnt = map.get(ransomNote[i]) - 1
            if (cnt < 0) return false
            map.set(ransomNote[i], cnt)
        } else {
            return false
        }
    }
    return true
};

使用数组

这里使用数组会比较好点,在空间复杂度上会低一些

var canConstruct = function (ransomNote, magazine) {
    let map = new Array(26).fill(0)
    for (let c of magazine) {
        map[c.charCodeAt(0) - 'a'.charCodeAt(0)]++
    }
    for (let c of ransomNote) {
        let cnt = map[c.charCodeAt(0) - 'a'.charCodeAt(0)]
        if (cnt <= 0) return false
        map[c.charCodeAt(0) - 'a'.charCodeAt(0)]--
    }
    return true
};