/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function (ransomNote, magazine) {
if (ransomNote === magazine) {
return true;
}
if (ransomNote.length > magazine.length) {
return false;
}
const a = {};
const b = {};
for (let i = 0; i < ransomNote.length; i++) {
a[ransomNote[i]] = a[ransomNote[i]] ? a[ransomNote[i]] + 1 : 1;
}
for (let i = 0; i < magazine.length; i++) {
b[magazine[i]] = b[magazine[i]] ? b[magazine[i]] + 1 : 1;
}
for (let x in a) {
if (!b[x] || a[x] > b[x]) {
return false;
}
}
return true;
};
const res = canConstruct("aa", "aab");
console.log(res);
思路
- 首先排除特殊情况,即randomNote===magazine以及randomNote.length>magazine.length的情况:前者可以直接返回true;而后者因为magazine上的每个字只能用一次,所以当赎金信randomNote上所需的字符数超过杂志magazine上时注定只能返回false。
接下来我们进行循环遍历,将randomNote和magazine转化为散列表,散列表的key为字符串中出现的字符,而相应的value则为这些字符出现的次数
// 例子
const a = "aaac";//字符串
const a_obj = {a: 3, c: 1};//转化后的散列表
接下来循环由randomNote所转化的散列表,将其中的key在magazine所转化出的散列表中进行比对,若该key在magazine中不存在或该key所对应的值有a[key]>b[key]则返回false,形如:
//a为ramdomNote所对应的散列表而b为magazine对应的散列表
b[key] = undefined
b[key] < a[key]