具有约束的两个字母的可能数组的算法

时间:2017-10-28 22:39:18

标签: algorithm combinations

我想写一个算法,用于找到由两个字母“n”和“o”的组合形成的每个可能的维数k的数组,但是在任何组合中我都不会有两个“n”彼此相邻。 例如,如果k = 4:

NOOO

中午

诺诺

ONOO

鄂嫩

专着

Ooon

我的尝试是一个函数,它产生一个数组[n,o,o,o,.... o]列表另一个数组,每2个记录带一个“n”,然后再次为数组调用它[ n,o,n,o,....,o]递归地

但我错过了[n,o,o,o,n,o,o,n,... o,o]这样的情况,当''之间出现多个''o'时N ''

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

试试这个:

public IEnumerable<IEnumerable<char>> Combinations(int length, char? current = null)
{
    var output = Enumerable.Empty<IEnumerable<char>>();
    if (length == 1)
    {
        if (current != 'n')
        {
            output = output.Concat(new[] { new[] { 'n' } });
        }
        output = output.Concat(new[] { new[] { 'o' } });
    }
    else if (length > 1)
    {
        if (current != 'n')
        {
            output = output.Concat(Combinations(length - 1, 'n').Select(xs => new[] { 'n' }.Concat(xs)));
        }
        output = output.Concat(Combinations(length - 1, 'o').Select(xs => new[] { 'o' }.Concat(xs)));
    }
    return output;
}

对于Combinations(4)我得到:

nono 
noon 
nooo 
onon 
onoo 
oono 
ooon 
oooo