找到Charset的所有组合

时间:2013-12-04 20:57:48

标签: java algorithm combinations

我正在试图找出一种方法来获取字符串中字符串的所有组合,并保持固定长度。 例如,Charset:

{ 'a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }

对于这个例子,我使用的是5的长度。

aaaaa
abaaa
aabaa
aaaba
aaaab
abbaa
aabba
...
zzzzz

我试过制定一个模式:

AAAAA
 +
ABAAA
 -+
AABAA
  -+
AAABA
   -+
AAAAB
 ++ -
ABBAA
 - +
AABBA
  - +
AAABB
 +  -
ABABA
   -+
ABAAB
 -+
AABAB
  -+
AAABB
 ++ -
ABBBA
 -  +
AABBB
 + -
ABABB
  +-
ABBAB
   +
ABBBB

但我被卡住了。

这不是家庭作业。

我该如何做到这一点?

编辑:

我是这样做的。下面接受的回应没有得到所有组合,但这样做:

for (int a = 0; a < 61; a++) {
        for (int b = 0; b < 61; b++) {
            for (int c = 0; c < 61; c++) {
                for (int d = 0; d < 61; d++) {
                    for (int e = 0; e < 61; e++) {
                        System.out.println(charset[a] + "" + charset[b]
                                + charset[c] + charset[d] + charset[e]);
                    }
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

此库可能会帮助您cppitertools。有了这个库你就可以这样做:

std::vector<int> v = {1,2,3,4,5};                                              
for (auto i : combinations(v,3)) {                                             
    //std::cout << i << std::endl;                                             
    for (auto j : i ) std::cout << j << " ";                                   
    std::cout<<std::endl;                                                      
}

在你的问题中你说的是组合,但是从你给出的输出看起来你想要与替换的组合,所以请记住,它们非常相似


您也可以只使用for循环(这是替换组合)。

for (int i = 0; i < size; ++i) {
    for (int j = i; j < size; ++j) {
        for (int k = j; k < size; ++k) {
            //print i j k indices
        }
    }
}

答案 1 :(得分:1)

你需要找到长度 k 的所有组合,包括序列[ c 0 ... c < / EM> <子> 名词 -1 ]。组合总数为 n k

一种方法是从0到 n k -1计数,表示基本 n 中的每个值向左填充零,并使用每个数字作为序列的索引:

/**
 * Generate all combinations of length len using the supplied char array
 */
public String[] generateCombos(int k, char[] chars) {
    final int n = chars.length;
    final int nCombos = (int) Math.pow(n, k);
    final String[] result = new String[nCombos];
    final StringBuilder sb1 = new StringBuilder();
    final StringBuilder sb2 = new StringBuilder();
    for (int i = 0; i < nCombos; ++i) {
        // generate zero-padded string representation of i base n
        sb1.setLength(0);
        final String indices = Integer.toString(i, n);
        for (int j = k - indices.length(); j > 0; --j) {
            sb1.append('0');
        }
        sb1.append(indices);
        // process each digit
        sb2.setLength(0);
        for (int j = 0; j < k; ++j) {
            sb2.append(chars[Integer.parseInt(sb1.substring(j, j + 1), n)]);
        }
        result[i] = sb2.toString();
    }
    return result;
}

这适用于任何结果字符串长度以及从Character.MIN_RADIXCharacter.MAX_RADIX(2-36个字符)的任意数量的不同字符。