0

哪种数据结构可以更好地存储以下替换密码字母映射?

abcdefghijklmnopqrstuvwxyz
qpalzxmskwoeidjcnvbfhguryt

我目前正在使用两个字典,但必须有一些更简单的东西:

char[] alphabet = {'a', 'b', 'c', 'd', 'e',
                   'f', 'g', 'h', 'i', 'j',
                   'k', 'l', 'm', 'n', 'o',
                   'p', 'q', 'r', 's', 't',
                   'u', 'v', 'w', 'x', 'y', 'z'};
char[] mappings = {'q', 'p', 'a', 'l', 'z',
                   'x', 'm', 's', 'k', 'w',
                   'o', 'e', 'i', 'd', 'j',
                   'c', 'n', 'v', 'b', 'f',
                   'h', 'g', 'u', 'r', 'y', 't'};

Dictionary<char, char> encrypt = new Dictionary<char, char>();
Dictionary<char, char> decrypt = new Dictionary<char, char>();

for (int i = 0; i < 26; i++)
{
    encrypt.Add(alphabet[i], mappings[i]);
    decrypt.Add(mappings[i], alphabet[i]);
}
4

2 回答 2

1

你的方法已经是最好的了。但是,请尝试将您的字典包装在一个类中,就像 Jon Skeet 在这里所做的那样:Getting key of value of a generic Dictionary?

于 2013-07-25T20:14:08.853 回答
0

以下是简化事情的方法:

只需使用一个 char[] 进行加密,另一个用于解密。您可以通过字母的 ascii 值对其进行索引,因此您可以使用更大的数组(256 而不是 26),但代码要简单得多。

考虑这样的事情:

string mapping="bcdefghij...za"; // simple example to code 'a' as 'b'.

char[] encode = new char[256];
char[] decode = new char[256];

for (char a='a'; a<='z'; a++) {
  encode[a]=mapping[a-'a'];
  decode[ mapping[a-'a'] ] = a;
}

然后您可以将 LINQ 用于编码功能,如下所示:

string encodeString(string plaintext) {
  return new string( plaintext.Select(c=>encode[c]).ToArray() );
}

您可能必须在其中添加一些类型转换(我没有尝试编译代码),但想法都在这里。

于 2013-07-25T18:05:24.283 回答