字符串:制作字谜

时间:2017-03-09 15:06:35

标签: c#

示例输入:
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);

1 个答案:

答案 0 :(得分:3)

首先,HashSet不存储重复项,因此如果您有两次相同的字符(对于ab),它只会存储一次。

示例:

string a = "abc";
string b = "cba";

如果你将它们都添加到hashset(你在第一个foreach循环中做的那个) hashset只包含三个字符(abc

在您的两个词典中,您可以存储每个唯一的字母,以及它在两个字符串中出现的频率。 string a的第一个字典和string b

的第二个字典
 foreach(char c in a)
 {
    dic[c]++;
 }

 foreach (char c in b)
 {
    dic2[c]++;
 }

在这里,您将增加字符串ab中每个唯一字符的计数器 因此,对于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

的总和