在接受采访时我被问到:给出一个电话号码,比如652-7872,打印出所有可能拼写的单词的排列。
2-ABC,
3-DEF,
4-GHI,
5-JKL,
6-MNO,
7-PQRS,
8-TUV,
9-WXYZ,
0-O
例如,652-7872的一个排列是JGAJAPP。
我已经看到了类似的问题,但是,解决方案要么不是单独的字母,要么字母在整个字符串中是随机的。
我相信这个问题是要求
For position 0 of the phone number string (652-7872), 6 - the only possible letter options are "MNO"
For position 1 of the phone number string (652-7872), 5 - the only possible letter options are "JKL"
For position 2 of the phone number string (652-7872), 2 - the only possible letter options are "ABC"
前3#的可能结果的简短版本是:
MJA
MJB
MJC
MKA
MKB
MKC
MLA
MLB
MLC
有人会告诉我如何在C#中解决这个问题吗?而且我对你需要多长时间感兴趣。
答案 0 :(得分:3)
这对我有用。从这开始:
var keys = new Dictionary<char, string>()
{
{ '1', "1" },
{ '2', "ABC" },
{ '3', "DEF" },
{ '4', "GHI" },
{ '5', "JKL" },
{ '6', "MNO" },
{ '7', "PQR" },
{ '8', "TUV" },
{ '9', "WXYZ" },
{ '0', "0" },
};
var number = "652";
现在我可以定义一个递归函数来生成排列:
Func<
IEnumerable<IEnumerable<char>>,
IEnumerable<char>,
IEnumerable<IEnumerable<char>>> f = null;
f = (css, cs) =>
{
if (!cs.Any())
{
return css;
}
else
{
return f(css
.SelectMany(
x => keys[cs.First()],
(x, k) => x.Concat(new [] { k })),
cs.Skip(1));
}
};
我可以这样称呼它:
var results =
f(
keys[number.ToCharArray().First()]
.ToCharArray()
.Select(x => new [] { x }),
number.ToCharArray().Skip(1))
.Select(x => new String(x.ToArray()));
我得到了这些结果: