我怎么能得到字符串数组的组合?

时间:2012-02-12 14:15:25

标签: c# algorithm

  

可能重复:
  Generating all Possible Combinations

我正在尝试用C ++或C#

做一些算法

基本上如果你有一个数组:

{"ab","cd"}

输出:

ac
ad
bc
bd

(我有两个嵌套for循环)

但如果我有一个包含3个元素的数组怎么办?还是4?

谢谢你们:)

4 个答案:

答案 0 :(得分:4)

您正在寻找任意多个字符序列的笛卡尔积。请参阅此博客文章:

http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx

和这个StackOverflow问题,你已经重复了。

Generating all Possible Combinations

答案 1 :(得分:2)

为了改变“嵌套循环”的数量,你需要使用递归。

void printCombination(string[] str, string partial, int p) {
    if (p == str.Length) {
        Console.WriteLine(partial);
        return;
    }
    for (int i = 0 ; i != str[p].Length; i++) {
        printCombination(str, partial + str[p][i], p+1);
    }
}

初始通话如下:

printCombination(new[] {"ab", "cd", "ef", "gh"}, "", 0);

编辑(回应OP的评论)

要了解发生了什么,首先需要了解参数的含义:

  • str是字符串数组。数组的每个元素对应于虚构嵌套循环的嵌套级别:元素0用于外部循环,元素1用于第一级嵌套,依此类推。
  • partial是部分构造的结果字符串。它在初始级别为空,在第一级嵌套时有一个字符,在第二级有两个,依此类推。
  • p是嵌套级别。它在初始级别为零,在第一个嵌套级别为1,依此类推。

该函数有两个部分 - 停止条件和递归调用的主体。停止条件很简单:一旦我们到达最后一级,partial结果不再是“部分”:它是完整的;我们可以把它打印出来然后退出。我们怎么知道我们处于最后一级? str的元素数量等于级别数,因此当p等于str数组的长度时,我们就完成了。

递归调用的主体是一个循环。它与嵌套循环的作用相同,但只有一个级别:每次迭代都会从自己的数组中添加一个字母,并递归调用自己的下一级别。

查看此操作的最佳方法是使用return语句在行上设置断点,然后查看调用堆栈窗口。单击每个调用级别,并检查函数参数的值。

如果您正在练习,请尝试修改此功能以获取两个参数而不是三个参数。提示:您可以通过观察partial的长度始终与p的值匹配来消除最后一个参数。

答案 2 :(得分:0)

在c ++中有一种名为std::next_permutation的算法。这是一个例子,希望这对你有帮助。

#include <algorithm>
#include <string>
#include <iostream>
int main()
{
    std::string s = "aba";
    std::sort(s.begin(), s.end());
    do {
        std::cout << s << '\n';
    } while(std::next_permutation(s.begin(), s.end()));
}

Output:
aab
aba
baa

答案 3 :(得分:0)

然后你不能使用嵌套的for循环,因为你不能以编程方式改变它。

在这种情况下,为每个元素使用一个计数器,这是您正在迭代的当前元素。 使用while循环和函数来检查是否已完成。

增加第一个元素的计数器,如果它已达到最大值,则将其设置为0并增加下一个计数器等。

(编辑:使用排列的解决方案可能在内部使用我的解决方案。)