计算字符串的变化

时间:2013-04-09 16:45:59

标签: c# permutation variations

我有一系列错误编码的base36值 - 这些值是使用缺少“i”和“o”的字母串从整数编码的。现在需要将它们转换回整数(使用c#)

由于翻转效应,存在多种排列。

“0”可以等于0或34 “1”可以等于1或35.

所以,例如,如果我有一个字符串“a110”,这有六个可能的值。

我很难设法为此编写代码。 我看过的所有例子都有一组元素的变体:例如。

char [] = {a,b,c}

int [] = {1,2,3}

然而,在我的情况下,也涉及条件,这让我的头部受伤。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以计算所有可能输入字符串的列表。首先,将输入读入一个int列表。现在,你知道每一个(如果它的价值足够低)可能是两件事之一。那么你就可以创建一个枚举器,它通过递归下降返回所有可能的输入。

答案 1 :(得分:0)

我设法用以下代码完成。它实际上比我预期的要简单一点,因为我只有两个条件和两个选项。它使用递归并逐步执行字符串中的每个字符。如果该字符为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