您的当前位置:首页正文

Leetcode1189: “气球”最大数量(simple)

2024-11-25 来源:个人技术集锦


1. 题目描述

给你一个字符串 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

2. 分析

        对输入字符串中'b', 'a', 'l', 'o', 'n'进行计数。

        由于balloon中包含两个‘l’和'o',将这两个字符的计数值除以2(向下取整),然后看各字母计数值的最小值即为所求。

        考虑用Python dict存储计数值。

        “x // 2”表示整数除法。

        dict中的值的最小值可以直接用min(d.values())求得。

3. 代码一

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))     

4. 代码二

        计数处理可以用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进行了初始化。

显示全文