电话号码到单词 - 排列 - C#

时间:2014-06-28 07:54:13

标签: c# permutation

在接受采访时我被问到:给出一个电话号码,比如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#中解决这个问题吗?而且我对你需要多长时间感兴趣。

1 个答案:

答案 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()));

我得到了这些结果:

results