383. 赎金信 Easy
给你两个字符串: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
解题思路
输入:两个字符列表 ransomNote
和 magazine
输出:判断 ransomNote
能不能由 magazine
里面的字符构成
本题属于 哈希表 问题。
用一个哈希表记录 magazine
的字母出现次数
遍历 ransomNote
时判断哈希表内该字母的次数
如果为 0 或不存在则为 false
都有次数则为 true
代码实现
python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
cache = {}
for ch in magazine:
cache[ch] = cache.get(ch, 0) + 1 # get 避免手动判断 key 存不存在
for ch in ransomNote:
if cache.get(ch, 0) == 0: # 默认值 0,简化判断
return False
cache[ch] -= 1
return True
javascript
var canConstruct = function(ransomNote, magazine) {
const cache = {};
for (let c of magazine) {
cache[c] = (cache[c] || 0) + 1;
}
for (let c of ransomNote) {
if (!cache[c]) return false;
cache[c] -= 1;
}
return true;
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)