这是我参与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;
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(n)
- 坚持算法每日一题,加油!