C#使用递归使用通配符构建排列

时间:2013-08-22 17:48:06

标签: c# sql recursion

所以我的思绪融化了。

我遇到的问题是我需要能够做到以下几点:

我有一个输入,用于定义我可以使用UP TO的通配符数,在本例中我们说2。

我有一个字符串,ABCDEFGH。

我需要创建一个包含这两个通配符在字符串中可以使用的所有不同方式的数组,以便我可以将它提供给SQL查询。

我们可以手工完成。

_BCDEFGH
A_CDEFGH
AB_DEFGH
ABC_EFGH
ABCD_FGH
ABCDE_GH
ABCDEF_H
ABCDEFG_

使用我们的限制2。

__CDEFGH
_B_DEFGH
_BC_EFGH
_BCD_FGH
_BCDE_GH
_BCDEF_H
_BCDEFG_
A__DEFGH
A_C_EFGH
A_CD_FGH
A_CDE_GH
A_CDEF_H
A_CDEFG_
AB__EFGH
AB_D_FGH
and so on...

为了与SQL兼容,我需要使用通配符作为下划线_。

有人可以帮我理解如何构建我的循环吗?请记住,通配符的限制并不总是2,它是一个变量。

这不是正则表达式或匹配的问题,我需要能够创建字符串的这些变体。

1 个答案:

答案 0 :(得分:2)

你得到这样的东西

 List<String> permutations(String original, int numberOfWildcards) {
        //add 1 more wildcard to each posible position in the original string
        List<String> perm = new List<String>();
        for (int i = 0; i < original.Length; ++i)
        {
            if (original[i] != '_')
                perm.Add(original.Substring(0, i) + "_" + original.Substring(i + 1, original.Length));
        }
        if ( numberOfWildcards == 1)
        {
              return perm;
        }

        //now if we need to search deeper we recusively do this for each substring
        List<String> permWithMoreWildmark = new List<String>();
        foreach (var str in perm)
        {
            permWithMoreWildmark.AddRange(permutations(str,numberOfWildcards-1));
        }
        return permWithMoreWildmark;
    } 

诀窍是首先尝试解决1深度问题,然后尝试找出递归