4

私を悩ませているこの単純なことの助けが必要です。私は多くの同様のアルゴリズムを見てきましたが、指定された文字セット配列で可能なすべての組み合わせ/順列に到達するために、これを正確に指定された方法で実行したいと考えています。

パスワードクラッカーブルートフォーサーの例を見てみましょう

例えば char[] charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

述べられた方法:

こんな感じです。現在の例では。

a,b,c,d......z     then at last index "z".  

it goes like      

aa,ab,ac....az.        then      

ba,bb,bc,bd........bz          then

same for ca, cb, and so on.

aaaa,aaab,aaac......aaaz   then

baaa,baab,baac.......baaz   to      zzzzzzzzzzzzzzzzzzzzzzzzzz

これまでに到達したコード:

(ただし、解決策ではありません)文字セット配列の長さと同じ数の for ループを使用することです。それは非常識です。これはうまくいきます。しかし、私はインテリジェントなものが必要です。

public class Bruteforcer {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
          char[] charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();


         int currentIndex = 0;
         String currentString = "";

         for (int i = 0; i < charset.length; i++) {
            char currentChar = charset[i];

             for (int j = 0; j < charset.length; j++) {

                 char c = charset[j];
                 currentString =  "" +currentChar + c;
                 System.out.println(currentString);

             }


         }


    }
}
4

7 に答える 7

3

再帰といくつかのループを使用できます。

public static void printCombinations(int length) {
    printCombinations(new char[length], 0, 0);
}

private static void printCombinations(char[] chars, int idx, int mask) {
    if (idx == chars.length) {
        System.out.println(chars);
        return;
    }
    for (int i = 0; i < 26; i++) {
        int mask2 = 1 << i;
        if ((mask2 & mask) == 0) {
            chars[idx] = (char) ('A' + i);
            printCombinations(chars, idx + 1, mask | mask2);
        }
    }
}

public static void main(String[] args) throws Exception {
    for (int i = 1; i <= 3; i++)
        printCombinations(i);
}

版画

A
B
...
ZYWX ... DCBA

組み合わせには繰り返し文字がないため、ZZZZZ にはなりません...

于 2013-09-08T15:55:35.703 に答える