383. 赎金信
解题过程
INFO
题目链接 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false magazine 中的每个字符只能在 ransomNote 中使用一次
javascript
/**
* @link https://leetcode.cn/problems/ransom-note/
* @title 383. 赎金信
* @description 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
* 如果可以,返回 true ;否则返回 false 。
* magazine 中的每个字符只能在 ransomNote 中使用一次
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
// 解法一
// 思路:通过循环统计magazine每个字符出现的次数map,然后循环遍历ransomNote递减出现在map的次数判断即可
var canConstruct = function (ransomNote, magazine) {
const mMap = new Map()
for (const key of magazine) {
mMap.set(key, (mMap.get(key) || 0) + 1)
}
for (const key of ransomNote) {
if (mMap.has(key) && mMap.get(key) !== 0) {
mMap.set(key, mMap.get(key) - 1)
} else {
return false
}
}
return true
};
// 解法二
// 思路:通过循环遍历正则表达式匹配ransomNote和magazine的字符数量判断即可
// 缺点:执行效果不理想,执行用时和内存消耗都比较多
var canConstruct = function (ransomNote, magazine) {
for (let i = 0; i < ransomNote.length; i++) {
const reg = new RegExp(`${ransomNote[i]}`, 'g')
if ((magazine.match(reg)?.length || 0) < (ransomNote.match(reg)?.length || 0)) {
return false
}
}
return true
}
// 解法三
// 思路:将magazine转为数组然后遍历ransomNote判断新数组元素值相同删除操作即可
// 缺点:执行效果相对解法二好一点而已
var canConstruct = function (ransomNote, magazine) {
const newMagazine = magazine.split('')
for (let i = 0; i < ransomNote.length; i++) {
if (newMagazine.includes(ransomNote[i])) {
const index = newMagazine.findIndex(item => item === ransomNote[i])
newMagazine.splice(index, 1)
} else {
return false
}
}
return true
}
// 解法四
// 思路:针对网上一种解法和根据我解法三代码进行优化
// 优点:执行用时很快,但内存消耗比较大
var canConstruct = function (ransomNote, magazine) {
for (let i = 0; i < ransomNote.length; i++) {
if (magazine.includes(ransomNote[i])) {
magazine = magazine.replace(ransomNote[i], '')
} else {
return false
}
}
return true
}
// const result = canConstruct('a', 'b') // false
// const result = canConstruct('aa', 'ab') // false
// const result = canConstruct('aa', 'aab') // true
const result = canConstruct('bg', 'efjbdfbdgfjhhaiigfhbaejahgfbbgbjagbddfgdiaigdadhcfcj') // true
console.log(result)
解题感受
这一题跟昨晚的题目很像,还可以写了 4 种解法,其实是想到哈希表解法来做的,但是不熟悉写不出来,看了官方题解也是使用哈希表来做的,自己做的解法没有太大的亮点,执行效果跟之前也是差不多的
优质题解
- https://leetcode.cn/problems/ransom-note/solution/shu-jin-xin-by-leetcode-solution-ji8a/
- https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html#%E6%9A%B4%E5%8A%9B%E8%A7%A3%E6%B3%95
- https://leetcode.cn/problems/ransom-note/solution/by-clever-austinzya-gd7u/
- https://leetcode.cn/problems/ransom-note/solution/dai-ma-jian-ji-yi-chong-huan-bu-cuo-de-j-ghn5/