3

我有一个包含 676 对字母的字符串列表,并且没有重复:(AA, AB, AC...ZW, ZX, ZZ

我有第二个字符串列表,其中包含相同的 676 对,但它们现在被打乱了:( GH,KI,RT...WE,SD,BB )

我需要以这样的方式映射两个列表上的每个元素,使它们互惠但不相同(不能有 BB=BB 等)

AA = GH
AB = KI
AC = RT
.
.
GH = AA
.
.
KI = AB
.
.
RT = AC

对于每个字母组(A*,B*,C*...),只有一个映射对可以以相同的字母开头。(例如,您可以有 CD=CH、DH=DE,但不能有 CD=CH、CE=CY...)

我被困在如何遍历每个元素(可能会重新排列第二个列表)并确保它们在两个列表上相互匹配。关于如何做到这一点的任何想法?谢谢!

4

3 回答 3

2

1) 只取第一个列表。此外,创建一个包含 26 个条目的布尔数组,每个条目对应一个字母字符。这将用于指示该字符的相同字母对是否已被使用。另外,制作字符串到字符串的映射。

2) 从列表中随机选择两个元素。

3)如果它是一个 OK 对(两次不是相同的条目,没有选择我们已经完成的相同字符起始对)将两个方向添加到地图 + 如果它是相同的字符起始对,则标记其在布尔数组。

4) 如果列表现在为空,则转到 5)。如果我们已经超过了一个神奇的尝试次数(例如 2000 或 3000),请返回 1)并重新开始。否则转至 2)。(这是因为有时我们可能会得到一个无法解决的结局,例如当我们已经有一个 C 起始对并且因此无法添加更多时,只有 C 起始条目)

5) 将映射解释为string,string元组列表,按第一个字符串按字母顺序对其进行排序,然后将每个元组解压缩为两个列表。第一个列表将是列表 A,第二个列表将是列表 B。您将只有完美的倒数,并且任何字母都不会超过一个相同的字母对。

于 2013-05-29T01:14:36.787 回答
0

假设两个列表具有相同的长度。你可以这样实现:

var list = new List<KeyValuePair<string, string>>();
for (int i = 0; i < length; i++)
{
    list.Add(new KeyValuePair<string, string>(keyList.ElementAt(i), valueList.ElementAt(i));
}
于 2013-05-29T01:03:35.910 回答
0

尝试这样的事情:

int count = l1.Count;
Dictionary<string, string> dict = new Dictionary<string, string>();

for (int i = 0; i <= count; i++) {
    string s1 = l1(i);
    string s2 = l2(i);

    if (!s1.Equals(s2)) {
        if (!s1[0].Equals(s2[0])) {
            dict.Add(s1, s2);
        } else {
                //magicMethod();
                }
    } else {
        //magicMethod();
    }
}

l1 和 l2 是您的列表。

于 2013-05-29T00:58:31.643 回答