获取给定字母表的所有4个字符的组合

时间:2012-03-12 16:38:21

标签: java permutation combinations

让我们说alphabet = "abcd1234" 我想要所有4位数的组合。 我不想通过所有排列,只选择那些长度为4个字符的字母,因为字母表可能很大。

编辑:这是我到目前为止所拥有的

String alpha = "abcdefg"; 

        for (int i = 0 ; i < alpha.length() ; i++) {
            for (int j = i ; j < alpha.length()-i ; j++) 
                    System.out.println(String.valueOf(alpha.charAt(i)) + String.valueOf(alpha.charAt(j))   );   
        }

不幸的是我只得到一个2个字符的单词。而我无法使用相同的循环结构打印4个字符的单词。

2 个答案:

答案 0 :(得分:4)

如果我正确理解了问题 - 所有组合aaaa到4444 - 那么这将有效。它是“可扩展的” - 每个字符不需要嵌套循环。

String alpha = "abcd1234";
char[] seq = alpha.toCharArray();

int length = 4;
StringBuilder builder = new StringBuilder("    ");

int[] pos = new int[length];
int total = (int) Math.pow(alpha.length(), length);
for (int i = 0; i < total; i++) {
    for (int x = 0; x < length; x++) {
        if (pos[x] == seq.length) {
            pos[x] = 0;
            if (x + 1 < length) {
                pos[x + 1]++;
            }
        }
        builder.setCharAt(x, seq[pos[x]]);
    }
    pos[0]++;

    System.out.println(builder.toString());
}

答案 1 :(得分:1)

最简单 - 如果位数很小并且是固定的 - 将是简单的枚举。只需迭代字母表中的成员。

从名称字母表中我假设此字符串中的每个字符都是唯一的,但在解决方案中可能会出现多次。如果没有在接受排列之前必须执行i1 != i2等必须执行的额外检查。

int alphaLen = alphabet.length();
for (int i1 = 0; i1 < alphaLen; ++i1) {
    for (int i2 = 0; i2 < alphaLen; ++i2) {
        for (int i3 = 0; i3 < alphaLen; ++i3) {
            for (int i4 = 0; i4 < alphaLen; ++i4) {
                foo(alphabet.charAt(i1) + alphabet.charAt(i2) + alphabet.charAt(i3) + alphabet.charAt(i4));
            }
        }
    }
}