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 种解法,其实是想到哈希表解法来做的,但是不熟悉写不出来,看了官方题解也是使用哈希表来做的,自己做的解法没有太大的亮点,执行效果跟之前也是差不多的
优质题解 
- https://leetcode.cn/problems/ransom-note/solution/shu-jin-xin-by-leetcode-solution-ji8a/
 - https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html#%E6%9A%B4%E5%8A%9B%E8%A7%A3%E6%B3%95
 - https://leetcode.cn/problems/ransom-note/solution/by-clever-austinzya-gd7u/
 - https://leetcode.cn/problems/ransom-note/solution/dai-ma-jian-ji-yi-chong-huan-bu-cuo-de-j-ghn5/
 
