日期:2026年6月22日
LeetCode 題目連結:1189. Maximum Number of Balloons
解題想法
簡單題,題目給定字串 text,要計算用 text 之中的字母可以組成幾個 balloon,每個字母最多只能使用一次。只要先計算 text 之中,字母 a, b, l, o, n 分別有幾個,計算 b, a, n 的數量及 l, o 的數量除以 2,答案是這 5 個數值中的最小值。計算字母數量時可以用表格計數,也可以使用字典計數。
Python 程式碼
dict,建立 dict 物件 cnt 時設定好 key 值,只記錄 a, b, l, o, n 的數量。Runtime: 3 ms, beats 61.87%. Memory: 19.24 MB, beats 75.19%.
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
# 用字典記錄 balon 的字母數量
cnt = {'b': 0, 'a': 0, 'l': 0, 'o': 0, 'n': 0}
for c in text:
if c in cnt:
cnt[c] += 1
# 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
ans = 100000
for c in "ban":
ans = min(ans, cnt[c])
for c in "lo":
ans = min(ans, cnt[c] // 2)
return ans
dict,建立 dict 物件 cnt 時設定好 26 個字母的 key 值,記錄所有字母的數量。Runtime: 3 ms, beats 61.87%. Memory: 19.10 MB, beats 99.41%.
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
# 用字典記錄 balon 的字母數量
cnt = {chr(ord('a') + i): 0 for i in range(26)}
for c in text:
cnt[c] += 1
# 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
ans = 100000
for c in "ban":
ans = min(ans, cnt[c])
for c in "lo":
ans = min(ans, cnt[c] // 2)
return ans
defaultdict,記錄所有字母的數量。Runtime: 2 ms, beats 68.66%. Memory: 19.35 MB, beats 38.08%.
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
# 用字典記錄 balon 的字母數量
cnt = defaultdict(int)
for c in text:
cnt[c] += 1
# 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
ans = 100000
for c in "ban":
ans = min(ans, cnt[c])
for c in "lo":
ans = min(ans, cnt[c] // 2)
return ans
表格計數。Runtime: 3 ms, beats 61.87%. Memory: 19.36 MB, beats 38.08%.
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
# 用表格記錄 balon 的字母數量
cnt = [0] * 26
for c in text:
cnt[ord(c) - ord('a')] += 1
# 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
ans = 100000
for c in "ban":
ans = min(ans, cnt[ord(c) - ord('a')])
for c in "lo":
ans = min(ans, cnt[ord(c) - ord('a')] // 2)
return ans
表格計數,找最小值時不跑迴圈。Runtime: 0 ms, beats 100.00%. Memory: 19.23 MB, beats 75.19%.
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
# 用表格記錄 balon 的字母數量
cnt = [0] * 26
for c in text:
cnt[ord(c) - ord('a')] += 1
# 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
return min(cnt[1], cnt[0], cnt[13], cnt[11] // 2, cnt[14] // 2)
C++ 程式碼
map,只記錄 a, b, l, o, n 的數量。Runtime: 3 ms, beats 12.33%. Memory: 8.91 MB, beats 64.87%.
class Solution {
public:
int maxNumberOfBalloons(string text) {
// 用字典記錄 balon 的字母數量
map<char, int> cnt = {{'a', 0}, {'b', 0}, {'l', 0}, {'n', 0}, {'o', 0}};
for(char c : text) {
if (cnt.count(c) == 1) {
cnt[c]++;
}
}
// 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
int ans = 100000;
ans = min(ans, cnt['b']);
ans = min(ans, cnt['a']);
ans = min(ans, cnt['n']);
ans = min(ans, cnt['l'] / 2);
ans = min(ans, cnt['o'] / 2);
return ans;
}
};
map,記錄所有字母的數量。Runtime: 2 ms, beats 19.90%. Memory: 8.86 MB, beats 84.03%.
class Solution {
public:
int maxNumberOfBalloons(string text) {
// 用字典記錄字母數量
map<char, int> cnt;
for(char c : text) {
cnt[c]++;
}
// 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
int ans = 100000;
ans = min(ans, cnt['b']);
ans = min(ans, cnt['a']);
ans = min(ans, cnt['n']);
ans = min(ans, cnt['l'] / 2);
ans = min(ans, cnt['o'] / 2);
return ans;
}
};
unordered_map,記錄所有字母的數量。Runtime: 0 ms, beats 100.00%. Memory: 9.06 MB, beats 39.61%.
class Solution {
public:
int maxNumberOfBalloons(string text) {
// 用字典記錄字母數量
unordered_map<char, int> cnt;
for(char c : text) {
cnt[c]++;
}
// 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
int ans = 100000;
ans = min(ans, cnt['b']);
ans = min(ans, cnt['a']);
ans = min(ans, cnt['n']);
ans = min(ans, cnt['l'] / 2);
ans = min(ans, cnt['o'] / 2);
return ans;
}
};
表格計數,記錄所有字母的數量。Runtime: 0 ms, beats 100.00%. Memory: 8.93 MB, beats 64.87%.
class Solution {
public:
int maxNumberOfBalloons(string text) {
// 用表格記錄字母數量
vector<int> cnt (26, 0);
for(char c : text) {
cnt[c - 'a']++;
}
// 找 ban 字母數量最小值,lo 字母數量 / 2 最小值
int ans = 100000;
ans = min(ans, cnt[1]); // b
ans = min(ans, cnt[0]); // a
ans = min(ans, cnt[13]); // n
ans = min(ans, cnt[11] / 2); // l
ans = min(ans, cnt[14] / 2); // o
return ans;
}
};
沒有留言:
張貼留言