迭代序列的所有可能变体

时间:2013-12-04 15:55:15

标签: algorithm

我有一系列n个字母:例如A B C A D或A B F A

我想要的是用字母之间的逗号来获取每个可能的变体。

即。为A B F A

A B F A

A,B F A

A B,F A

A B F,A

A,B,F A

A B,F,A

A,B F,A

A,B,F,A

有人可以推荐一个好的算法吗?语言不重要。

4 个答案:

答案 0 :(得分:1)

使用二进制系统完成此任务。 1表示存在逗号,0表示不存在逗号。数字中的每个位置通知另一个逗号的存在。例如AFA:

  

00:A F A

     

01:A F,A

     

10:A,F A

     

11:A,F,A

必须从范围[0 ..(n-1)^ 2-1]

中取出数字

答案 1 :(得分:1)

使用二进制数组表示是否有逗号的简单解决方案。

A B F A包含逗号可能为(AB,BF,FA)的三个位置

这意味着如果您创建3元素数组并尝试0和1的每个可能组合,您将获得所需的结果。 000,001,010,011,100,101,110,111

java中的简单程序打印n位的所有二进制排列:

 String s = "ABFA";
 int bits = s.length() - 1;
 int lastNumber = (int)Math.pow(2, bits);
 System.out.println(lastNumber);
 for (int i = 0; i < lastNumber; i++) {
     System.out.println(completeZeros(Integer.toString(i, 2), bits));
 }

 static String completeZeros(String s, int bits) {
    String result = s;
    for (int i = 0; i < bits - s.length(); i++) {
        result = "0" + result; 
    }
    return result;
 }

要将二进制排列“010”应用于字符串“ABFA”,请使用下一个函数:

static String applyBinary(String s, String binary) {
    String result = "" + s.charAt(0);
    for (int i = 0; i < binary.length(); i++) {
        if (binary.charAt(i) == '1') result += ", ";
        result += s.charAt(i + 1);
    }
    return result;
}

输出结果为:

ABFA
ABF, A
AB, FA
AB, F, A
A, BFA
A, BF, A
A, B, FA
A, B, F, A

答案 2 :(得分:0)

这是一个简单的JavaScript演示。

var str = "ABFA";
function algo(str) {
    var result = [];
    var n = str.length;
    var total = Math.pow(n-1, 2) - 1;
    for(var mask = 0; mask < total; mask++) {
        var bits = mask;
        var newstr = "";
        for(var i=0; i<str.length - 1; i++, bits>>>=1) {
            var hasComma = (bits & 1) == 1;
            newstr += str.charAt(i);
            newstr += (hasComma ? "," : " ");
        }
        newstr += str.charAt(str.length - 1);
        result.push(newstr);
    }
    return result;
}
algo(str);
  • 您计算的组合总数“总计”
  • 你数到那个数字“面具”
    • 您使用计数器“位”的二进制位来添加逗号

答案 3 :(得分:0)

这个问题有两种方法。

1.Recursive(Start =“printAllComb(s,”“,0);”)

printAllComb(string s, string const, int i)
 {
    if ( i == s.length() )
           print const
    printAllComb(s,const+string.at(i)+',',i+1);
    printAllComb(s,const+string.at(i),i+1);  
 }

2.Dynamic Programming

char binaryS[s.length]="0000"; 
//Basically no. of zeros = no. of Alphabets in the string
//define a function AddOne() which adds 1 to the character representation
//AddOne() modifies the character array such that it stays in the bit representation
//Characters because to save space
while ( All the bits are not one )
{
       for ( int i=0; i<s.length(); i++ )
       {
             print s.at(i)
             if ( binaryS.at(i) == '1' )
                print ","                            
       }
       print "\n" 
       AddOne();
}