Javaでワードアンスクランブラーを作っています。現在、3文字以上の単語から選択された3文字のすべての再配置を印刷できるプログラムがあります(繰り返しはありません)。たとえば、パラメーターがabcdの場合、次のように出力されます。
[[abc, abd, acb, acd, adb, adc, bac, bad, bca, bcd, bda, bdc, cab, cad, cba, cbd, cda, cdb, dab, dac, dba, dbc, dca, dcb] ]
順列で 2D 配列リストを埋めています。現在、2D 配列には、3 文字の順列を含む配列が 1 つしかありません。2D 配列に、単語の長さで停止する、1 文字、2 文字、3 文字などの順列の配列が必要です。問題は、これを達成するためにネストされた for ループの可変数が必要なことです。3 文字の順列については、3 つのネストされた for ループがあります。それぞれがパラメーター内の文字を循環します。
public static void printAllPermuations(String word)
{
int len = word.length();
ArrayList<String> lets = new ArrayList<String>();
//this array of letters allows for easier access
//so I don't have to keep substringing
for (int i = 0; i < len; i++)
{
lets.add(word.substring(i, i + 1));
}
ArrayList<ArrayList<String>> newWords = new ArrayList<ArrayList<String>>();
newWords.add(new ArrayList<String>());
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
for (int k = 0; k < len; k++)
{
if (i != j && i != k && j != k)
//prevents repeats by making sure all indices are different
{
newWords.get(0).add(lets.get(i) + lets.get(j) + lets.get(k));
}
}
}
}
System.out.println(newWords);
}
私は他の投稿を見てきましたが、再帰がこれを解決できると聞きました。ただし、それをどのように実装するかはわかりません。また、理解できない複雑なソリューションもいくつか見てきました。再帰を伴うかどうかにかかわらず、可能な限り簡単な解決策を求めています。