我正在尝试解决一个我以前从未见过的场景,并且很难想出一个正确实现的算法。我的问题之一是记忆中朦胧的术语。我认为我需要的是标准“组合”问题的变体,但我可能会偏离轨道。
该场景
给定一个示例字符串
"100"
(我们称其为x
),生成将其中一个0
(零)字符替换为o
(小写字母 o)的所有x
组合。因此,对于简单的"100"
示例,我期望得到以下输出:
"100"
"10o"
"1o0"
"1oo"
这需要支持长度和0
字符数量不同的字符串,但是假设0
字符的数量永远不超过5个。
我有一个非常简单的算法,适用于我的"100"
示例,但对于任何更长/更复杂的内容都会崩溃:
public IEnumerable<string> Combinations(string input)
{
char[] buffer = new char[input.Length];
for(int i = 0; i != buffer.Length; ++i)
{
buffer[i] = input[i];
}
//return the original input
yield return new string(buffer);
//look for 0's and replace them
for(int i = 0; i != buffer.Length; ++i)
{
if (input[i] == '0')
{
buffer[i] = 'o';
yield return new string(buffer);
buffer[i] = '0';
}
}
//handle the replace-all scenario
yield return input.Replace("0", "o");
}
我有一种烦人的感觉,递归可能是我的朋友,但我在努力想出如何结合我需要的条件逻辑。