我想写一个算法,用于找到由两个字母“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 ''
感谢您的帮助
答案 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