赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
codeType
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:
codeType
输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:
codeType
输入:ransomNote = "aa", magazine = "aab"
输出:true
提示:
- 1 <= ransomNote.length, magazine.length <= 105
- ransomNote 和 magazine 由小写英文字母组成
解法
ts
function canConstruct(ransomNote: string, magazine: string): boolean {
/**
这题涉及到的查找操作比较多,可以用hashmap简化查找操作
charMap用来记录magazine的每个字符的数量
*/
const n = ransomNote.length
const m = magazine.length
if(m < n) return false
const charMap = new Map<string, number>()
for(let i = 0; i < m; i++){ // 初始化
const curCh = magazine[i]
if(charMap.has(curCh)){
charMap.set(curCh, charMap.get(curCh) + 1)
}else{
charMap.set(curCh, 1)
}
}
for(let i = 0; i < n; i++){
const ch = ransomNote[i]
if(charMap.has(ch)){
let count = charMap.get(ch)
if(count === 0) return false
charMap.set(ch, count - 1)
}else{
return false
}
}
return true
};