【LeetCode】“气球” 的最大数量Java题解

150 阅读2分钟

这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

题目描述

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。

字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。

示例 1:

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

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

示例 3:
输入:text = "leetcode"
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-balloons
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是字符串处理题目,题意明了,我们需要考虑balloon 和目标字符串相关出现的字符和字符的数量,不需要考虑字符出现的顺序。
  • 因此,我们首先遍历 balloon 统计出现的字符和频率,然后遍历 text 中的字符和频率。分别比较,按照题意处理即可。在存储字符和字符频率的时候,我们既可以使用 hashmap 存储,也可以使用字符数组存储。采用字符数组处理的时候,使用了 ASCII 码相关知识。ASCII 码一套电脑编码系统,其中65~90为26个大写英文字母,97~122号为26个小写英文字母。以下代码供参考。

通过代码

class Solution {
    public int maxNumberOfBalloons(String text) {
        int ans = 0;
        int[] cnt = new int[26];
        int[] ballonCnt = new int[26];
        for (char ch : text.toCharArray()) {
            cnt[ch - 'a']++;
        }
        for (char c : "balloon".toCharArray()) {
            ballonCnt[c - 'a']++;
        }

        for (int i = 0; i < 26; i++) {
            if (ballonCnt[i] > 0) {
                if (ballonCnt[i] > cnt[i]) {
                    ans = 0;
                    break;
                } else {
                    if (ans > 0) {
                        ans = Math.min(ans, cnt[i] / ballonCnt[i]);
                    } else {
                        ans = Math.max(ans, cnt[i] / ballonCnt[i]);
                    }
                }
            }
        }

        return ans;
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!