Получить все 4-символьные комбинации данного алфавита - PullRequest
2 голосов
/ 12 марта 2012

скажем 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))   );   
        }

К сожалению, я получаю только двухсимвольное слово. И я не могу заставить его печатать 4-символьные слова, используя одинаковую структуру циклов.

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

Если я правильно понимаю проблему - все комбинации от 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 голос
/ 12 марта 2012

Простейшим - если количество цифр мало и фиксировано - будет простое перечисление. Просто переберите членов алфавита.

Из названия алфавита я предполагаю, что каждый символ в этой строке уникален, но в решении может встречаться несколько раз. Если не требуется дополнительная проверка, что 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));
            }
        }
    }
}
...