题目:
给你一个字符串 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果:
从结果上来看,运行速度是很快的
解题思路:
当看到题目的时候,我想这如果气球的判断是必须按照顺序的话就用双指针。再仔细看了示例并不是一定要顺序的。那么我们可以通过没给字母出现的字数来判断我们能够组成多少组。
由此想到了通过哈希表存储每个字母出现的个数。最后就是判断即可。
其中有个坑就是当‘l’ 和 ‘o’的个数是其他的两倍,所以需要考虑其个数是奇数的场景是不能满足下一个气球的组合的。因此这里不用count * 2来判断大小,而是用除法。这样确保了奇数的场景。(因为奇数的时候,除以2之后获得的是除掉小数位后的数字,也就是必定当前的数字是最大存在的偶数场景:如 3 除以 2之后int类型下我们只能获得1,而不是1.5)
代码:
int maxNumberOfBalloons(char * text){
int hash[26] = {0};
// 将text中包含的字母数量录入
int len = strlen(text);
for(int i = 0; i < len; i++) {
hash[text[i]-'a'] ++;
}
//计算‘b' 'a' 'n'的最小个数count和 'l' 'o'的最小个数(保证其小于count * 2)
int count = hash['b' - 'a'];
count = count <= hash[0] ? count : hash[0];
count = count <= hash['n' - 'a'] ? count : hash['n' - 'a'];
count = count <= hash['l' -'a'] / 2 ? count : hash['l' - 'a'] / 2;
count = count <= hash['o' -'a'] / 2 ? count : hash['o' - 'a'] / 2;
return count;
}