1189-“气球” 的最大数量

Raphael Liu Lv10

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

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

示例 1:

![](https://assets.leetcode-cn.com/aliyun-lc-
upload/uploads/2019/09/14/1536_ex1_upd.jpeg)

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

示例 2:

![](https://assets.leetcode-cn.com/aliyun-lc-
upload/uploads/2019/09/14/1536_ex2_upd.jpeg)

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

示例 3:

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

提示:

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

方法一:统计

思路

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

代码

[sol1-Python3]
1
2
3
4
5
6
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
cnt = Counter(ch for ch in text if ch in "balon")
cnt['l'] //= 2
cnt['o'] //= 2
return min(cnt.values()) if len(cnt) == 5 else 0
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int maxNumberOfBalloons(string text) {
vector<int> cnt(5);
for (auto & ch : 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] /= 2;
cnt[3] /= 2;
return *min_element(cnt.begin(), cnt.end());
}
};
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int maxNumberOfBalloons(String text) {
int[] cnt = new int[5];
for (int i = 0; i < text.length(); ++i) {
char ch = text.charAt(i);
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] /= 2;
cnt[3] /= 2;
return Arrays.stream(cnt).min().getAsInt();
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Solution {
public int MaxNumberOfBalloons(string text) {
int[] cnt = new int[5];
foreach (char ch in 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] /= 2;
cnt[3] /= 2;
return cnt.Min();
}
}
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define MIN(a, b) ((a) < (b) ? (a) : (b))

int maxNumberOfBalloons(char * text) {
int cnt[5];
int n = strlen(text);
memset(cnt, 0, sizeof(int) * 5);
for (int i = 0; i < n; i++) {
if (text[i] == 'b') {
cnt[0]++;
} else if (text[i] == 'a') {
cnt[1]++;
} else if (text[i] == 'l') {
cnt[2]++;
} else if (text[i] == 'o') {
cnt[3]++;
} else if (text[i] == 'n') {
cnt[4]++;
}
}
cnt[2] /= 2;
cnt[3] /= 2;
int res = INT_MAX;
for (int i = 0; i < 5; i++) {
res = MIN(res, cnt[i]);
}
return res;
}
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func maxNumberOfBalloons(text string) int {
cnt := [5]int{}
for _, ch := range 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] /= 2
cnt[3] /= 2
ans := cnt[0]
for _, v := range cnt[1:] {
if v < ans {
ans = v
}
}
return ans
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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),其中 n 为字符串的长度,C 表示单词中字符的种类数,在本题中 C = 5。需要遍历一遍字符串,并求出单词中字符的最小数目。

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

 Comments
On this page
1189-“气球” 的最大数量