LeetCode:383. 勒索信 - JavaScript 解决方案 🚀

97 阅读2分钟

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w1wmm9vij14e9kn6bew3.gif

🚀 问题描述

给定两个字符串 ransomNotemagazine

  • 如果可以用 magazine 中的字母构造出 ransomNote,则返回 true
  • magazine 中的每个字母在 ransomNote 中只能使用一次。

💡 示例

示例 1

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

示例 2

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

示例 3

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

🏆 JavaScript 解决方案

我们通过计算 magazine 中每个字母的出现次数,并将其与 ransomNote 所需的计数进行比较来解决这个问题。

实现代码

var canConstruct = function(ransomNote, magazine) {
    const charCount = {};

    for (let char of magazine) {
        charCount[char] = (charCount[char] || 0) + 1;
    }

    for (let char of ransomNote) {
        if (!charCount[char] || charCount[char] <= 0) {
            return false;
        }
        charCount[char]--;
    }

    return true;
};

console.log(canConstruct('a1a', 'aab1'))
console.log(canConstruct('aa', 'ab'))

🔍 工作原理

  1. 统计杂志中的字符
    • 创建一个哈希表(charCount),用于存储 magazine 中每个字符的频率。
  1. 验证勒索信
    • 遍历 ransomNote 中的每个字符。
    • 检查该字符是否在 charCount 中存在。
    • 如果不存在,返回 false
    • charCount 中该字符的计数减一。
  1. 返回结果
    • 如果所有字符都找到了足够的计数,则返回 true

🔑 复杂度分析

  • 时间复杂度O(n+m),其中 nmagazine 的长度,mransomNote 的长度。
    • 统计 magazine 中的字符需要 O(n)
    • 验证 ransomNote 需要 O(m)
  • 空间复杂度O(k),其中 kmagazine 中的唯一字符数。

📋 手动运行示例

输入:ransomNote = "aa", magazine = "aab"

输出:true

✨ 面试技巧

  1. 明确约束条件
    • 确保 ransomNotemagazine 只包含小写字母。
    • 询问关于空字符串等边缘情况。
  1. 讨论优化
    • 强调使用哈希表确保高效字符计数。
  1. 边界情况
    • ransomNotemagazine 长 → 立即返回 false
    • magazine 中包含所有字符,但计数不足。

LeetCode: leetcode.com/problems/ra…

原文:dev.to/rahulgithub…