【力扣】383.赎金信|每日一题|刷题打卡

39 阅读1分钟

一、题目描述

给你两个字符串: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

 

提示:

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

二、思路分析

  1. 定义一个对象,存储 magazine 中的每个字符出现的次数
  2. 遍历 ransomNote,如果字符没有出现在对象中,则返回false;如果存在,则让对应字符次数递减,如果小于0了,表示ransomNote中对应的字符偏多,不满足,返回false

三、代码答案

/**
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function (ransomNote, magazine) {
  if (ransomNote.length > magazine.length) return false;
  const mp = {}
  for (let i = 0; i < magazine.length; i++) { 
    if (!mp[magazine[i]]) {
      mp[magazine[i]] = 1
    } else {
      mp[magazine[i]]++
    }
  }
  for (let i = 0; i < ransomNote.length; i++) { 
    if (!mp[ransomNote[i]]) {
      return false
    } else {
      mp[ransomNote[i]]--
      if (mp[ransomNote[i]] < 0) {
        return false
      }
    }
  }
  return true
};