示例输入:
string a = "cde"
string b = "abc"
样品输出:
4
该算法如何工作,为什么rez+=Math.abs(dic[c] -dic2[c])
会返回正确的结果。我认为它是使用ascii但是,我仍然不明白它是如何工作的。
感谢您的帮助
string a = Console.ReadLine();
string b = Console.ReadLine();
//HashSet, we have a simple syntax for taking the union of elements in a set
HashSet<char> hashset = new HashSet<char>();
foreach(char c in a )
{
hashset.Add(c);
}
foreach (char c in b)
{
hashset.Add(c);
}
Dictionary<char, int> dic = new Dictionary<char, int>();
Dictionary<char, int> dic2 = new Dictionary<char, int>();
foreach(char c in hashset)
{
dic.Add(c, 0);
dic2.Add(c, 0);
}
foreach(char c in a)
{
dic[c]++;
}
foreach (char c in b)
{
dic2[c]++;
}
int rez = 0;
foreach(char c in hashset)
{
rez += Math.Abs(dic[c] - dic2[c]);
}
Console.WriteLine(rez);
答案 0 :(得分:3)
首先,HashSet不存储重复项,因此如果您有两次相同的字符(对于a
和b
),它只会存储一次。
示例:
string a = "abc";
string b = "cba";
如果你将它们都添加到hashset(你在第一个foreach循环中做的那个)
hashset只包含三个字符(a
,b
,c
)
在您的两个词典中,您可以存储每个唯一的字母,以及它在两个字符串中出现的频率。
string a
的第一个字典和string b
foreach(char c in a)
{
dic[c]++;
}
foreach (char c in b)
{
dic2[c]++;
}
在这里,您将增加字符串a
和b
中每个唯一字符的计数器
因此,对于dic
,您增加string a
中出现的每个字符的每个计数器
对于dic2
,您正在增加string b
所以你在计算不同字符串中字符的出现次数,但你并不关心顺序(这使得它成为 anagram )
最后,看看它是否是一个字谜你是否减去每个独特角色的(正)差异。
int rez = 0;
foreach(char c in hashset)
{
rez += Math.Abs(dic[c] - dic2[c]);
}
因此,对于"cde"
和"abc"
的示例字符串,您有六个字母
其中两个字符串一次出现在两个字符串中,因此您在 4个字母中存在差异,并且每次出现一次,这相当于 4的总和(rez
) 强>
计算示例: DIC:
{[c, 1]}
{[d, 1]}
{[e, 1]}
{[a, 0]}
{[b, 0]}
DIC2:
{[c, 1]}
{[d, 0]}
{[e, 0]}
{[a, 1]}
{[b, 1]}
现在,如果你计算每个角色:
dic[c] - dic2[c] = 0
dic[d] - dic2[d] = 1
dic[e] - dic2[e] = 1
dic[a] - dic2[a] = -1
dic[b] - dic2[b] = -1
现在,因为您只获取每个结果的绝对值,所以得到 4
的总和