如何获得一系列字母的每种可能模式

Joh*_*ohn 12 javascript c# algorithm

可能重复:
有没有更好的方法来排列字符串?

让我们说我有这些信件

A B C D

我希望在一个4个字母长的字符串中得到这些字母的每一个可能的模式/组合.

AAAA

咩咩咩

畜牧业协会

daaa

ABAA

ACAA

ACAD

ABBA

等等.

我可以用什么循环或模式列出每种可能的组合?

我在C#中写这个,但是C++和javascript中的例子也是受欢迎的.

我目前的想法只为每个字母增加一个字母.然后向右移动一次并重复.这不包括像.

ABBA

Eri*_*ert 49

您可以使用LINQ轻松完成:

string[] items = {"a", "b", "c", "d"};
var query = from i1 in items
            from i2 in items
            from i3 in items
            from i4 in items
            select i1 + i2 + i3 + i4;

foreach(var result in query)
    Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

如果你不知道你想要四个组合,你可以用更多的工作来计算任意笛卡尔积:

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


Joe*_*Joe 7

这里只有一个for循环

var one = ['a','b','c','d'];
var length = one.length;
var total = Math.pow(length, length);
var pow3 = Math.pow(length,3);
var pow2 = Math.pow(length,2);

for(var i = 0; i<total; i++)
    console.log(one[Math.floor(i/pow3)], 
        one[Math.floor(i/pow2)%length], 
        one[Math.floor(i/length)%length], 
        one[i%length]);
Run Code Online (Sandbox Code Playgroud)

这是一个简单的低效方法:

var one = ['a','b','c','d'];
var i,j,k,l;
var len = 4;
for(i=0;i<len;i++) {
    for(j=0;j<len;j++) {
        for(k = 0; k < len; k++) {
            for(l = 0; l<len; l++) {
                console.log(one[i], one[j], one[k], one[l]);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

类似的C#:

        var one = new[] {'a','b','c','d'};
        var len = one.Length;

        for(var i=0;i<len;i++) {
            for(var j=0;j<len;j++) {
                for(var k = 0; k < len; k++) {
                    for(var l = 0; l<len; l++) {
                        Console.Write(one[i] +  one[j] + one[k] +  one[l]);
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 你真的不需要4个阵列吗? (3认同)
  • 这可以使用一个数组并引用不同的索引来完成. (2认同)