3

676 ペアの文字を含む文字列リストがあり、繰り返しはありません: ( AA, AB, AC...ZW, ZX, ZZ )

同じ 676 ペアの 2 番目の文字列リストがありますが、現在はシャッフルされています: ( GH,KI,RT...WE,SD,BB )

両方のリストの各要素を、相互的であるが同じではない方法でマップする必要があります(BB = BBなどを持つことはできません..)

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

各文字グループ (A*、B*、C*...) について、同じ文字で開始できるマップされたペアは 1 つだけです。(たとえば、CD=CH、DH=DE は指定できますが、CD=CH、CE=CY は指定できません...)

各要素を調べて(おそらく2番目のリストをシャッフルする)、両方のリストでそれらが互いに一致することを確認する方法にこだわっています。これを行う方法についてのアイデアはありますか?ありがとう!

4

3 に答える 3

2

1) 最初のリストだけを取得します。さらに、アルファベット文字ごとに 1 つずつ、長さ 26 のブール配列を作成します。これは、その文字の同じ文字のペアがまだ使用されているかどうかを示すために使用されます。また、文字列から文字列へのマップを作成します。

2) リストからランダムに 2 つの要素を選択します。

3) OK ペアの場合 (同じエントリが 2 回ではなく、既に行った同じ文字の開始ペアを選択しなかった場合)、マップに両方向を追加します + 開始ペアが同じ文字の場合は、その文字エントリにフラグを立てますブール配列。

4) リストが空の場合は、5) に進みます。試行回数がマジック ナンバー (たとえば 2000 または 3000) を超えた場合は、1 に戻ってやり直します。それ以外の場合は 2) に進みます。(これは、すでに C の開始ペアがあり、それ以上追加できない場合に、C の開始エントリのみなど、解決できない結末になる場合があるためです)

5) マップをタプルのリストとして解釈string,stringし、最初の文字列でアルファベット順にソートし、各タプルを 2 つのリストに解凍します。最初のリストはリスト A になり、2 番目のリストはリスト B になります。

于 2013-05-29T01:14:36.787 に答える
0

2 つのリストの長さが同じであるとします。次のように実装できます。

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 に答える