「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球) 。
字符串 text中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词**"balloon"**。
示例 1:
输入:text = "nlaebolko"
输出:1
示例 2:
输入:text = "loonbalxballpoon"
输出:2
示例 3:
输入:text = "leetcode"
输出:0
构成单词 需要 1 个字母 、1 个字母 、2 个字母 、2 个字母 、1 个字母 ,因此只需要统计字符串中字母 的数量即可。其中每个字母 需要两个 ,可以将字母 的数量除以 2,返回字母 中数量最小值即为可以构成的单词数量。
var maxNumberOfBalloons = function(text) {
const cnt = new Array(5).fill(0);
for (const ch of text) {
if (ch === 'b') {
cnt[0]++;
} else if (ch === 'a') {
cnt[1]++;
} else if (ch === 'l') {
cnt[2]++;
} else if (ch === 'o') {
cnt[3]++;
} else if (ch === 'n') {
cnt[4]++;
}
}
cnt[2] = Math.floor(cnt[2] / 2);
cnt[3] = Math.floor(cnt[3] / 2);
return _.min(cnt);
};
复杂度分析
- 时间复杂度:,其中 n 为字符串的长度,C 表示单词中字符的种类数,在本题中 。需要遍历一遍字符串,并求出单词中字符的最小数目。
空间复杂度:,C 表示单词中字符的种类数,在本题中 。需要 的空间存储字符的统计数目。
方法二
构建一个balloon需要1个b、1个a、1个n和2个l、2个o,材料则是输入字符串text 和顺序无关,我们只关心其中提供banlo这几个字母的数量。 和木桶原理一样,最多能构建出多少个 balloon 完全取决于哪个字母最不够用;我们可以遍历对字母频率计数,判断每个字母最多可以构成几个 balloon,取最小的即可。 比如对出现一次的b\a\n而言,text中每出现一次b\a\n都可以构成一个balloon。 对出现两次的l\o而言,text中每出现两次l\o都可以构成一个balloon,即需要对字母频率除二。
计算后,取最小的即可。
class Solution {
public:
int maxNumberOfBalloons(string text) {
int cnt[26]{0};
int ans = INT_MAX;
for (auto c: text) {
cnt[c-'a']++;
}
ans = min(ans, cnt[1]/1);
ans = min(ans, cnt[0]/1);
ans = min(ans, cnt['l'-'a']/2);
ans = min(ans, cnt['o'-'a']/2);
ans = min(ans, cnt['n'-'a']/1);
return ans;
}
};