🚀 问题描述
给定两个字符串 ransomNote 和 magazine:
- 如果可以用
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'))
🔍 工作原理
- 统计杂志中的字符:
-
- 创建一个哈希表(
charCount),用于存储magazine中每个字符的频率。
- 创建一个哈希表(
- 验证勒索信:
-
- 遍历
ransomNote中的每个字符。 - 检查该字符是否在
charCount中存在。 - 如果不存在,返回
false。 - 将
charCount中该字符的计数减一。
- 遍历
- 返回结果:
-
- 如果所有字符都找到了足够的计数,则返回
true。
- 如果所有字符都找到了足够的计数,则返回
🔑 复杂度分析
- 时间复杂度:
O(n+m),其中n是magazine的长度,m是ransomNote的长度。
-
- 统计
magazine中的字符需要O(n)。 - 验证
ransomNote需要O(m)。
- 统计
- 空间复杂度:
O(k),其中k是magazine中的唯一字符数。
📋 手动运行示例
输入:ransomNote = "aa", magazine = "aab"
输出:true
✨ 面试技巧
- 明确约束条件:
-
- 确保
ransomNote和magazine只包含小写字母。 - 询问关于空字符串等边缘情况。
- 确保
- 讨论优化:
-
- 强调使用哈希表确保高效字符计数。
- 边界情况:
-
ransomNote比magazine长 → 立即返回false。magazine中包含所有字符,但计数不足。
LeetCode: leetcode.com/problems/ra…