0213-1189. “气球” 的最大数量

126 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

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

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

示例 1:

image.png

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

示例 2:

image.png

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

示例 3:

输入:text = "leetcode"
输出:0

构成单词 "balloon""balloon" 需要 1 个字母 b‘b’、1 个字母 a‘a’、2 个字母 l‘l’ 、2 个字母 o‘o’ 、1 个字母 n‘n’,因此只需要统计字符串中字母 a,b,l,o,n‘a’,‘b’,‘l’,‘o’,‘n’ 的数量即可。其中每个字母 "balloon""balloon" 需要两个 l,o‘l’,‘o’,可以将字母 l,o‘l’,‘o’的数量除以 2,返回字母 a,b,l,o,n‘a’,‘b’,‘l’,‘o’,‘n’中数量最小值即为可以构成的单词数量。

var maxNumberOfBalloons = function(text) {
    const cnt = new Array(5).fill(0);
    for (const ch of text) {
        if (ch === 'b') {
            cnt[0]++;
        } else if (ch === 'a') {
            cnt[1]++;
        } else if (ch === 'l') {
            cnt[2]++;
        } else if (ch === 'o') {
            cnt[3]++;
        } else if (ch === 'n') {
            cnt[4]++;
        }
    }
    cnt[2] = Math.floor(cnt[2] / 2);
    cnt[3] = Math.floor(cnt[3] / 2);
    return _.min(cnt);
};

复杂度分析

  • 时间复杂度:O(n+C)O(n+C),其中 n 为字符串的长度,C 表示单词中字符的种类数,在本题中 C=5C=5。需要遍历一遍字符串,并求出单词中字符的最小数目。

空间复杂度:O(C)O(C),C 表示单词中字符的种类数,在本题中 C=5C=5。需要 O(C)O(C) 的空间存储字符的统计数目。

方法二

构建一个balloon需要1个b、1个a、1个n和2个l、2个o,材料则是输入字符串text 和顺序无关,我们只关心其中提供banlo这几个字母的数量。 和木桶原理一样,最多能构建出多少个 balloon 完全取决于哪个字母最不够用;我们可以遍历对字母频率计数,判断每个字母最多可以构成几个 balloon,取最小的即可。 比如对出现一次的b\a\n而言,text中每出现一次b\a\n都可以构成一个balloon。 对出现两次的l\o而言,text中每出现两次l\o都可以构成一个balloon,即需要对字母频率除二。

计算后,取最小的即可。

class Solution {
public:
    int maxNumberOfBalloons(string text) {
        int cnt[26]{0};
        int ans = INT_MAX;
        for (auto c: text) {
            cnt[c-'a']++;
        }
        ans = min(ans, cnt[1]/1);
        ans = min(ans, cnt[0]/1);
        ans = min(ans, cnt['l'-'a']/2);
        ans = min(ans, cnt['o'-'a']/2);
        ans = min(ans, cnt['n'-'a']/1);

        return ans;
    }
};