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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Unicode®标准附录#9 UNICODE双向算法#### 摘要#### 本附件是一份关于字符定位的规范,主要描...
    Eriice阅读 4,916评论 0 6
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,272评论 0 4
  • 这是小川的第391次更新,第421篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第2...
    程序员小川阅读 646评论 0 1
  • 知识点总结 二分查找法(二分查找法是弱点)**以及相关的操作:递归实现和非递归实现,floor 和 ceiling...
    李威威阅读 955评论 0 0
  • 【打架】(分行体) 大剩 儿子说他自己是古代大诗人 我问他那你死了多久 他笑着打我骂你才死了 把他爸叫过来问 我和...
    于林1阅读 94评论 0 1