所以,我有一个我需要破解的密码。我有密钥,但问题是密码中的每个数字都对应三个或两个字母。例如,如果我们有密码' 12,我们知道' 1'对应于' A',' J'或' S'和' 2'对应于' B'' K'或者' T',我们需要输出所有可能的组合,因此:' AB',' AK'' AT',&# 39; JB',' JK',' JT',' SB',' SK',' ST&#39 ;。我将如何在C#中进行此操作?
提前致谢。
答案 0 :(得分:0)
使用LINQ,您可以使用以下代码:
var input = "12";
var mappings = new Dictionary<string, string[]>();
mappings.Add("1", new string[] { "A", "J", "S" });
mappings.Add("2", new string[] { "B", "K", "T" });
var result = input.Select(c => mappings[c.ToString()]).CartesianProduct();
foreach (var item in result)
{
Console.WriteLine(string.Join("", item.ToArray()));
}
它使用CartesianProduct extension method
中的Eric Lipperts blog可以变得更容易
答案 1 :(得分:0)
您可以使用Linq创建交叉联接:
char[][] cl1 = { new[] {'A','J','S'}, new[] {'B','K','T'}, new[] {'C','L','U'} ......};
int offsetchar1 = 0;
int offsetchar2 = 1;
var j = (from c1 in cl1[offsetchar1]
from c2 in cl1[offsetchar2]
select
c1.ToString() + c2.ToString()).ToArray();
添加第三个字符:
int offsetchar3 = 2;
var k = (from j1 in j
from c3 in cl1[offsetchar3]
select
j1 + c3.ToString()).ToArray();