Skip to content

383. 赎金信

解题过程

INFO

题目链接 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false magazine 中的每个字符只能在 ransomNote 中使用一次

javascript
/**
 * @link https://leetcode.cn/problems/ransom-note/
 * @title 383. 赎金信
 * @description 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
 * 如果可以,返回 true ;否则返回 false 。
 * magazine 中的每个字符只能在 ransomNote 中使用一次
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
// 解法一
// 思路:通过循环统计magazine每个字符出现的次数map,然后循环遍历ransomNote递减出现在map的次数判断即可
var canConstruct = function (ransomNote, magazine) {
  const mMap = new Map()
  for (const key of magazine) {
    mMap.set(key, (mMap.get(key) || 0) + 1)
  }

  for (const key of ransomNote) {
    if (mMap.has(key) && mMap.get(key) !== 0) {
      mMap.set(key, mMap.get(key) - 1)
    } else {
      return false
    }
  }

  return true
};

// 解法二
// 思路:通过循环遍历正则表达式匹配ransomNote和magazine的字符数量判断即可
// 缺点:执行效果不理想,执行用时和内存消耗都比较多
var canConstruct = function (ransomNote, magazine) {
  for (let i = 0; i < ransomNote.length; i++) {
    const reg = new RegExp(`${ransomNote[i]}`, 'g')
    if ((magazine.match(reg)?.length || 0) < (ransomNote.match(reg)?.length || 0)) {
      return false
    }
  }

  return true
}

// 解法三
// 思路:将magazine转为数组然后遍历ransomNote判断新数组元素值相同删除操作即可
// 缺点:执行效果相对解法二好一点而已
var canConstruct = function (ransomNote, magazine) {
  const newMagazine = magazine.split('')

  for (let i = 0; i < ransomNote.length; i++) {
    if (newMagazine.includes(ransomNote[i])) {
      const index = newMagazine.findIndex(item => item === ransomNote[i])
      newMagazine.splice(index, 1)
    } else {
      return false
    }
  }

  return true
}

// 解法四
// 思路:针对网上一种解法和根据我解法三代码进行优化
// 优点:执行用时很快,但内存消耗比较大
var canConstruct = function (ransomNote, magazine) {
  for (let i = 0; i < ransomNote.length; i++) {
    if (magazine.includes(ransomNote[i])) {
      magazine = magazine.replace(ransomNote[i], '')
    } else {
      return false
    }
  }

  return true
}

// const result = canConstruct('a', 'b') // false
// const result = canConstruct('aa', 'ab') // false
// const result = canConstruct('aa', 'aab') // true
const result = canConstruct('bg', 'efjbdfbdgfjhhaiigfhbaejahgfbbgbjagbddfgdiaigdadhcfcj') // true
console.log(result)

解题感受

这一题跟昨晚的题目很像,还可以写了 4 种解法,其实是想到哈希表解法来做的,但是不熟悉写不出来,看了官方题解也是使用哈希表来做的,自己做的解法没有太大的亮点,执行效果跟之前也是差不多的

优质题解