我设法用下面的代码做到了。它实际上比我预期的要简单一些,因为我只有两个条件和两个选项。它使用递归并逐步遍历字符串中的每个字符。如果该字符是 0 或 1,则它会发散,并继续构建字符串。
它实际上会生成一些重复项,因此我必须添加一个条件,仅当它不存在时才将其添加到字符串列表中。如果其他人可以指出我稍微更好的逻辑,我将不胜感激
public string st = "101"; // hardcoded for now
public char[] cs;
public List<string> variations;
static void Main()
{
cs = st.ToCharArray();
variations = new List<string>();
vary("",0);
}
static void vary(string m, int n)
{
for (int i = n; i < cs.Count(); i++)
{
if (cs[i] == '0' || cs[i] == '1')
{
// recurse
combo(m + (cs[i] == '0' ? "0" : "1"), i + 1);
combo(m + (cs[i] == '0' ? "Y" : "Z"), i + 1);
}
m += cs[i];
}
if(!variations.Contains(m))
variations.Add(m);
}
对于字符串“101”,我得到以下组合
101
10Z
1Y1
1YZ
Z01
Z0Z
ZY1
ZYZ