题目链接
image.png

  1. /**
  2. * @param {string} ransomNote
  3. * @param {string} magazine
  4. * @return {boolean}
  5. */
  6. var canConstruct = function (ransomNote, magazine) {
  7. if (ransomNote === magazine) {
  8. return true;
  9. }
  10. if (ransomNote.length > magazine.length) {
  11. return false;
  12. }
  13. const a = {};
  14. const b = {};
  15. for (let i = 0; i < ransomNote.length; i++) {
  16. a[ransomNote[i]] = a[ransomNote[i]] ? a[ransomNote[i]] + 1 : 1;
  17. }
  18. for (let i = 0; i < magazine.length; i++) {
  19. b[magazine[i]] = b[magazine[i]] ? b[magazine[i]] + 1 : 1;
  20. }
  21. for (let x in a) {
  22. if (!b[x] || a[x] > b[x]) {
  23. return false;
  24. }
  25. }
  26. return true;
  27. };
  28. const res = canConstruct("aa", "aab");
  29. console.log(res);

思路

  1. 首先排除特殊情况,即randomNote===magazine以及randomNote.length>magazine.length的情况:前者可以直接返回true;而后者因为magazine上的每个字只能用一次,所以当赎金信randomNote上所需的字符数超过杂志magazine上时注定只能返回false
  2. 接下来我们进行循环遍历,将randomNote和magazine转化为散列表,散列表的key为字符串中出现的字符,而相应的value则为这些字符出现的次数

    1. // 例子
    2. const a = "aaac";//字符串
    3. const a_obj = {a: 3, c: 1};//转化后的散列表
  3. 接下来循环由randomNote所转化的散列表,将其中的key在magazine所转化出的散列表中进行比对,若该key在magazine中不存在该key所对应的值有a[key]>b[key]则返回false,形如:

    1. //a为ramdomNote所对应的散列表而b为magazine对应的散列表
    2. b[key] = undefined
    3. b[key] < a[key]