/*** @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] = undefinedb[key] < a[key]

