文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:“气球”的最大数量
出处:1189. “气球”的最大数量
难度
2 级
题目描述
要求
给你一个字符串 text \texttt{text} text,你需要使用 text \texttt{text} text 中的字母来组成尽可能多的单词 “balloon" \text{``balloon"} “balloon"(气球)。
字符串 text \texttt{text} text 中的每个字母最多只能被使用一次。请你返回可以组成的单词数量的最大值。
示例
示例 1:
输入:
text
=
"nlaebolko"
\texttt{text = "nlaebolko"}
text = "nlaebolko"
输出:
1
\texttt{1}
1
示例 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} 1≤text.length≤104
- 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 中出现的次数。