我正在用java做一个单词解读器。现在我有一个程序可以打印从具有 3 个或更多字母(不重复)的单词中选择的 3 个字母的所有重新排列。例如,如果参数是abcd,它将打印:
[[abc,abd,acb,acd,adb,adc,bac,坏,bca,bcd,bda,bdc,cab,cad,cba,cbd,cda,cdb,dab,dac,dba,dbc,dca,dcb] ]
我正在用排列填充一个二维数组列表。现在二维数组内部只有一个数组,其中包含 3 个字母的排列。我希望二维数组具有 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);
}
我看过其他帖子,听说递归可以解决这个问题。不过,我不知道我将如何实现它。而且我还看到了一些我不理解的复杂解决方案。我要求尽可能简单的解决方案,无论是否涉及递归。