给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。
字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。
示例 1:
输入:text = "nlaebolko"
输出:1
示例 2:
输入:text = "loonbalxballpoon"
输出:2
示例 3:
输入:text = "leetcode"
输出:0
提示:
1 <= text.length <= 10^4
text 全部由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-balloons
对输入字符串中'b', 'a', 'l', 'o', 'n'进行计数。
由于balloon中包含两个‘l’和'o',将这两个字符的计数值除以2(向下取整),然后看各字母计数值的最小值即为所求。
考虑用Python dict存储计数值。
“x // 2”表示整数除法。
dict中的值的最小值可以直接用min(d.values())求得。
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
cnt_dict = dict()
cnt_dict['b'] = 0
cnt_dict['a'] = 0
cnt_dict['l'] = 0
cnt_dict['o'] = 0
cnt_dict['n'] = 0
for c in text:
if c in ['b','a','l','o','n']:
cnt_dict[c] = cnt_dict[c] + 1
cnt_dict['l'] = cnt_dict['l'] // 2
cnt_dict['o'] = cnt_dict['o'] // 2
return min(cnt_dict.values())
if __name__ == '__main__':
sln = Solution()
text = "nlaebolko"
print(sln.maxNumberOfBalloons(text))
print(sln.maxNumberOfBalloons2(text))
text = "loonbalxballpoon"
print(sln.maxNumberOfBalloons(text))
print(sln.maxNumberOfBalloons2(text))
text = "leetcode"
print(sln.maxNumberOfBalloons(text))
print(sln.maxNumberOfBalloons2(text))
计数处理可以用Python.collections中的Counter类来处理,代码会显得更加紧凑。如下所示:
class Solution:
def maxNumberOfBalloons(self, text: str) -> int:
cnt = Counter(c for c in text if c in 'balon')
cnt['l'] = cnt['l'] // 2
cnt['o'] = cnt['o'] // 2
return min(cnt.values()) if len(cnt)==5 else 0
但是,使用Counter有个坑需要小心。因为它只统计出现过的字符的个数。比如说,如果text中根本就没有出现'b',那它不会记录以'b'为key的条目。如果依然直接用min(dict.values())求结果的话就会出错。代码中“if len(cnt)==5”的条件就是为了避开这个坑。在上面“代码一”中不需要这个条件是因为一开始就针对5个key进行了初始化。