【发布时间】:2025-12-12 23:05:01
【问题描述】:
我正在尝试解决我以前从未见过的场景,并且正在努力想出一个算法来正确地实现它。我的部分问题是对正确术语的模糊回忆。我相信我需要的是标准“组合”问题的变体,但我很可能会离开那里。
情景
给定一个示例字符串"100"(我们称之为x),生成x 的所有组合,将0(零)字符之一换成o(小写的o)。因此,对于"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");
}
我有一种挥之不去的感觉,递归可能是我的朋友,但我正在努力弄清楚如何在这里合并我需要的条件逻辑。
【问题讨论】:
-
难道你不能只拥有一个零位置的本地数组,然后以二进制模式枚举替换,零和小 o 作为二进制数字吗?
-
@MOehm 不确定我是否理解你的意思,你能提供一个实现和/或其他细节吗?
标签: c# algorithm combinatorics