【力扣刷题】1189. “气球” 的最大数量【Map 映射优化】

234 阅读1分钟

「这是我参与11月更文挑战的第 18 天,活动详情查看:2021最后一次更文挑战

原题链接

1189. “气球” 的最大数量 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。

字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。

测试用例

示例 1:

输入: text = "nlaebolko"
输出: 1

示例 2:

输入: text = "loonbalxballpoon"
输出: 2

参数限制

  • 1 <= text.length <= 10^4
  • text 全部由小写英文字母组成

分析

给定一个字符串,我们最多可以从这个字符串中提取多少个指定的单词 balloon,即需要我们统计这个字符串中各个字符出现的频率,并且,我们只关注 balloon 的组成字母 a,b,l,o,n 各出现了多少此,并且,由于出现的字母只能使用一次,但单词中 l, o 出现了两次,需要我们在最后统计的到的对应结果上除 2

代码

常规的解法是,我们定义一个数组,规定第 1,2,3,4,5 位分别存储 a,b,l,o,n 的计数,然后我们只需要在遍历字符串的时候依次去判断是否为我们需要的字母,若是的话,就在对应的数组位置里,计数 +1

但是,这里有一种更优秀的解法,借助 js 中的 object 对象,我们将需要的字母定义为 obj 的属性,然后,遍历字符串的时候,若 obj[x] == undefined 则表名这个字母不是我们需要的

最小的字母会限制组合 balloon 的数量,我们最后比较大小后选出最小的数即可

var maxNumberOfBalloons = function(text) {
    let obj = {
        b: 0,
        a: 0,
        l: 0,
        o: 0,
        n: 0
    };
    text.split('').forEach(n => {
        if (obj[n] != undefined) obj[n] = obj[n] + 1;
    })
    obj['l']=parseInt(obj['l']/2);
    obj['o']=parseInt(obj['o']/2);
    let ks = Object.keys(obj).sort((a,b)=>obj[a]-obj[b]);
    return obj[ks[0]];
};

image.png

今天的力扣刷题就分享到这里,感谢大家的阅读~