leetcode 383
题目:
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
(一点解析)
Dictionary<char, int> charCount = new Dictionary<char, int>();
这一行创建了一个新的Dictionary对象,键是字符类型(char),值是整数类型(int)。foreach (char c in magazine)
这一行开始遍历magazine字符串中的每个字符。循环变量c会依次取得字符串magazine中的每个字符的值。charCount[c] = 1;
这一行在字典charCount中为每个字符设置计数为1。如果字符已经在字典中,它的计数就会被设置为1;如果字符不在字典中,它就会被添加到字典中并设置计数为1。
答:
public class Solution
{
public bool CanConstruct(string ransomNote, string magazine)
{
Dictionary<char, int> count = new Dictionary<char, int>();
//先统计magazine里的所有字符,并统计每个字符的出现次数,有则加1,没有则添加该字符串
foreach (char c in magazine)
{
count[c] = count.ContainsKey(c) ? count[c] + 1 : 1;
}
foreach (char c in ransomNote)
{
//遍历ransomNote的字符,如果count中没有,则直接返回false
//如果有,则每遍历到,如果count为0,则false,不为零则减1,
//知道遍历结束,返回true
if (!count.ContainsKey(c))
{
return false;
}
else if (count[c] == 0)
{
return false;
}
else
{
count[c]--;
}
}
return true;
}
}