• LeetCode.1189-balloon实例数最大值(Maximum Number of Balloons)


    这是小川的第416次更新,第449篇原创


    看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第267题(顺位题号是1189)。给定一个字符串文本,使用文本字符来构成单词"balloon"的尽可能多的实例。每个字符最多可以在文本中使用一次。返回可以形成的最大实例数。

    例如:

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

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

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

    约束

    • 1 <= text.length <= 10^4
    • 文本字符串仅包含小写英文字母。

    第一种解法

    题目的意思是要在一个给定的字符串中,找到能够组成字符串"balloon"的最大字符对数,本质上和木桶装水的容量由短板决定类似。

    直接遍历text字符串中的字符,对字母ablno的出现次数计数,因为l和o是需要两个,在计数完后,需要对lo的次数除2,然后比较5个字母出现次数的最小值,因为只有出现次数最小的那个字母才能最终决定组成多少个"balloon"

    public int maxNumberOfBalloons(String text) {
        if (text == "" || text.length() < 7) {
            return 0;
        }
        int A = 0, B = 0, L = 0, O = 0, N = 0;
        int len = text.length();
        for (int i=0; i<len; i++) {
            if (text.charAt(i) == 'a') {
                A++; 
            } else if (text.charAt(i) == 'b') {
                B++;
            } else if (text.charAt(i) == 'l') {
                L++;
            } else if (text.charAt(i) == 'n') {
                N++;
            } else if (text.charAt(i) == 'o') {
                O++;
            }
        }
        L /= 2;
        O /= 2;
        int min = Math.min(A, B);
        min = Math.min(min, N);
        if (min == 0) {
            return 0;
        }
        if (L !=0 && O != 0) {
            min = Math.min(min, L);
            min = Math.min(min, O);
            return min;
        }
        return 0;
    }
    

    第二种解法

    针对第一种解法里,在循环中判断字母的方式,可以换成使用一个长度为26的int数组,根据26个英文字母的顺序,直接从数组中取值即可,最后返回5个数中的最小值。

    public int maxNumberOfBalloons2(String text) {
        if (text == "" || text.length() < 7) {
            return 0;
        }
        int A = 0, B = 0, L = 0, O = 0, N = 0;
        int len = text.length();
        int[] arr = new int[26];
        for (int i=0; i<len; i++) {
            arr[text.charAt(i)-'a']++;
        }
        A = arr[0];
        B = arr[1];
        L = arr[11]/2;
        N = arr[13];
        O = arr[14]/2;
        int min = Math.min(A, B);
        min = Math.min(min, N);
        min = Math.min(min, L);
        min = Math.min(min, O);
        return min;
    }
    

    第三种解法

    针对第二种解法,我们可以将5个局部变量也省略掉,毕竟只是比较最小值,直接去数组里取就行。

    public int maxNumberOfBalloons3(String text) {
        if (text == "" || text.length() < 7) {
            return 0;
        }
        int len = text.length();
        int[] arr = new int[26];
        for (int i=0; i<len; i++) {
            arr[text.charAt(i)-'a']++;
        }
        int min = Math.min(arr[0], arr[1]); //a b
        min = Math.min(min, arr[13]); // n
        min = Math.min(min, arr[11]/2); // l
        min = Math.min(min, arr[14]/2); // o
        return min;
    }
    

    小结

    算法专题目前已更新LeetCode算法题文章273+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、在看就是对我最大的回报和支持!

  • 相关阅读:
    项目经理手记
    自动填写版权信息
    在批处理中实现等待/延迟/暂停
    使用 PowerDesigner 设计数据库
    如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的角本
    管理人员的招聘始末谈
    PowerDesign 6简易介绍
    PowerDesigner11.0使用总结
    用表单字段加亮的方式为用户提供友好的界面
    择才有道——企业招聘方式比较
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11595591.html
Copyright © 2020-2023  润新知