给你一个字符串 text
,你需要使用 text
中的字母来拼凑尽可能多的单词 "balloon"(气球)。
字符串 text
中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。
示例 1:
输入:text = "nlaebolko" 输出:1
示例 2:
输入:text = "loonbalxballpoon" 输出:2
示例 3:
输入:text = "leetcode" 输出:0
提示:
1 <= text.length <= 10^4
text
全部由小写英文字母组成
润物细无声,春风草又生
看一下这道题,一个字符串 “**********” 与一个 dictionary<> 1、将字符串也转为dictionary
转换了以后可以比较一个dic中是否包含当前foreach 中的key,如果不包含“气球”中的字母直接return 0 ;
最后 点睛之笔,text 的dic 的value 除以 气球的 value。直接对比那个最小存最小值。
public class Solution {
public int MaxNumberOfBalloons(string text) {
var dic = new Dictionary<char, int>()
{
{'b', 1 },
{'a', 1 },
{'l' , 2},
{'o', 2 },
{'n', 1 }
};
var dic2 = new Dictionary<char, int>();
foreach (var ch in text)
{
if (dic2.ContainsKey(ch))
dic2[ch]++;
else dic2.Add(ch, 1);
}
int count = int.MaxValue;
foreach (var keyVal in dic)
{
if (!dic2.ContainsKey(keyVal.Key))
{
return 0;
}
count = Math.Min(count, dic2[keyVal.Key] / keyVal.Value);
}
return count;
}
}
方法二: linq
public class Solution {
public int MaxNumberOfBalloons(string text) {
var s = new HashSet<char>(new []{'b', 'a', 'l', 'o', 'n'});
var source = text.ToCharArray();
if (s.Intersect(source).Count() != s.Count) {
return 0;
}
return source.GroupBy(i => i)
.Where(j => s.Contains(j.Key))
.Select(k => k.Key == 'l' || k.Key == 'o' ? k.Count() / 2 : k.Count())
.Aggregate(int.MaxValue, (acc, val) => Math.Min(acc, val));
}
}