每种可能的组合算法

时间:2014-11-21 21:35:15

标签: algorithm

假设我有2个符号由A和B组成。我想打印A和B的所有组合,最大长度为n。 n可以是3,4或5。

例如当n = 3时,总共有8种可能性:

AAA
AAB
ABB
BBB
BBA
BAA
BAB
ABA

最简单有效的方法是什么? 感谢

4 个答案:

答案 0 :(得分:2)

可能性对应于您可以用n位表示的所有可能数字的位模式:

0 = 000 -> AAA
1 = 001 -> AAB
2 = 010 -> ABA
3 = 011 -> ABB
4 = 100 -> BAA
5 = 101 -> BAB
6 = 110 -> BBA
7 = 111 -> BBB

您可以简单地循环数字,并使用字符而不是二进制数字来获取二进制表示。

示例:

var n = 3;
var chars = [ 'A', 'B' ];

var max = Math.pow(2, n);

for (var i = 0; i < max; i++) {
  var s = '', x = i;
  while (s.length < n) {
    s = chars[x & 1] + s;
    x >>= 1;
  }
  document.write(s + '<br>');
}

答案 1 :(得分:0)

对于给定的 n ,总有 2 ^ n 方式,对于每个位置,我们可以选择2个不同的符号。对于一般数量的符号,通常的方法是回溯,但由于您只有两个符号,使用位掩码的更简单方法有效。

请注意,以二进制编写的 0 2 ^ n - 1 之间的数字包含所有可能的长度为 n 的位掩码,因此您可以只需&#34;以二进制形式打印数字,写入A或B,具体取决于该位是0还是1。

#include <iostream>
using namespace std;

int main() {
  int n;
  cin >> n;

  for (int i = 0; i < (1 << n); ++i) {
    for (int j = 0; j < n; ++j) {
      cout << (((i >> j) & 1) ? "B" : "A");
    }
    cout << endl;
  }
}

答案 2 :(得分:0)

将int转换为bit-bool数组,然后循环该数组。只要你知道它只有2个字符(AB),那么二进制应该可以工作。

permutations(int n):
    for(int i = 0; i < 2^n; i++)
        print convert(toBitArray(int));

string convert(bool[] bits)
    string retStr = "":
    for(int b = 0; b < bits.size; b++)
        if(bits[b])
            retStr += "A";
        else
            retStr += "B";

bool[] toBitArray(int i):
    //converts int to a a bit-bool array

答案 3 :(得分:0)

由于你只有两个符号,你可以使用多个N位的二进制表示,用A替换零,用B替换1。这是一些伪代码,因为没有语言是指定的

for k in range 0 to 2^N-1
  printString(k, N)
end for

printString(k,N)
  for N times 
      if LSB(k)==0  //(or mod 2 is 0)
          print A
      else
          print B
      shift k right one bit //(or divide by 2)
  print newline