哈希表题目:“气球”的最大数量

题目

标题和出处

标题:“气球”的最大数量

出处:1189. “气球”的最大数量

难度

2 级

题目描述

要求

给你一个字符串 text \texttt{text} text,你需要使用 text \texttt{text} text 中的字母来组成尽可能多的单词 “balloon" \text{``balloon"} “balloon"(气球)。

字符串 text \texttt{text} text 中的每个字母最多只能被使用一次。请你返回可以组成的单词数量的最大值。

示例

示例 1:

示例 1

输入: text   =   "nlaebolko" \texttt{text = "nlaebolko"} text = "nlaebolko"
输出: 1 \texttt{1} 1

示例 2:

示例 2

输入: text   =   "loonbalxballpoon" \texttt{text = "loonbalxballpoon"} text = "loonbalxballpoon"
输出: 2 \texttt{2} 2

示例 3:

输入: text   =   "leetcode" \texttt{text = "leetcode"} text = "leetcode"
输出: 0 \texttt{0} 0

数据范围

  • 1 ≤ text.length ≤ 10 4 \texttt{1} \le \texttt{text.length} \le \texttt{10}^\texttt{4} 1text.length104
  • text \texttt{text} text 全部由小写英语字母组成

解法

思路和算法

要组成一个单词 “balloon" \text{``balloon"} “balloon",需要使用 1 1 1 ‘b’ \text{`b'} ‘b’ 1 1 1 ‘a’ \text{`a'} ‘a’ 2 2 2 ‘l’ \text{`l'} ‘l’ 2 2 2 ‘o’ \text{`o'} ‘o’ 1 1 1 ‘n’ \text{`n'} ‘n’。为了计算能组成单词 “balloon" \text{``balloon"} “balloon" 的最大数量,需要统计字符串 text \textit{text} text 中这 5 5 5 个字母的出现次数,其余字母忽略。

在单词 “balloon" \text{``balloon"} “balloon" 中,字母 ‘b’ \text{`b'} ‘b’ ‘a’ \text{`a'} ‘a’ ‘n’ \text{`n'} ‘n’ 各出现 1 1 1 次,因此能组成单词 “balloon" \text{``balloon"} “balloon" 的最大数量一定不超过这 3 3 3 个字母中的任意字母的出现次数。

在单词 “balloon" \text{``balloon"} “balloon" 中,字母 ‘l’ \text{`l'} ‘l’ ‘o’ \text{`o'} ‘o’ 各出现 2 2 2 次,因此能组成单词 “balloon" \text{``balloon"} “balloon" 的最大数量一定不超过这 2 2 2 个字母中的任意字母的出现次数除以 2 2 2

在统计字符串 text \textit{text} text 中这 5 5 5 个字母的出现次数之后,计算满足上述要求的最大值,即为能组成单词 “balloon" \text{``balloon"} “balloon" 的最大数量。

代码

class Solution {
    public int maxNumberOfBalloons(String text) {
        int bCount = 0, aCount = 0, lCount = 0, oCount = 0, nCount = 0;
        int length = text.length();
        for (int i = 0; i < length; i++) {
            char c = text.charAt(i);
            if (c == 'b') {
                bCount++;
            } else if (c == 'a') {
                aCount++;
            } else if (c == 'l') {
                lCount++;
            } else if (c == 'o') {
                oCount++;
            } else if (c == 'n') {
                nCount++;
            }
        }
        int maxCount = Integer.MAX_VALUE;
        maxCount = Math.min(maxCount, bCount);
        maxCount = Math.min(maxCount, aCount);
        maxCount = Math.min(maxCount, lCount / 2);
        maxCount = Math.min(maxCount, oCount / 2);
        maxCount = Math.min(maxCount, nCount);
        return maxCount;
    }
}

复杂度分析

  • 时间复杂度: O ( n + ∣ Σ ∣ ) O(n + |\Sigma|) O(n+Σ),其中 n n n 是字符串 text \textit{text} text 的长度, Σ \Sigma Σ 是字符集,这道题中字符集为单词 “balloon" \text{``balloon"} “balloon" 中出现的不同字母, ∣ Σ ∣ = 5 |\Sigma| = 5 Σ=5。首先遍历 text \textit{text} text 计算每个字符在 text \textit{text} text 中出现的次数,时间复杂度是 O ( n ) O(n) O(n),然后根据每个字符的出现次数计算能组成单词 “balloon" \text{``balloon"} “balloon" 的最大数量,时间复杂度是 O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ),因此总时间复杂度是 O ( n + ∣ Σ ∣ ) O(n + |\Sigma|) O(n+Σ)

  • 空间复杂度: O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ),其中 Σ \Sigma Σ 是字符集,这道题中字符集为单词 “balloon" \text{``balloon"} “balloon" 中出现的不同字母, ∣ Σ ∣ = 5 |\Sigma| = 5 Σ=5。需要记录单词 “balloon" \text{``balloon"} “balloon" 中出现的每个字符在 text \textit{text} text 中出现的次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值