Java 字符串置换

Java 字符串置换,java,string,arraylist,permutation,recurrence,Java,String,Arraylist,Permutation,Recurrence,我最近试图编写一个脚本,用Java打印出一个单词的所有排列。出于某种原因,它只打印出一个。我就是搞不懂 import java.util.*; public class AllPermutations { ArrayList<String> letters = new ArrayList<String>(); public void main(){ letters.add("H"); letters.add("a");

我最近试图编写一个脚本,用Java打印出一个单词的所有排列。出于某种原因,它只打印出一个。我就是搞不懂

import java.util.*;

public class AllPermutations {

    ArrayList<String> letters = new ArrayList<String>();
    public void main(){
        letters.add("H");
        letters.add("a");
        letters.add("s");
        permutate("",letters);
    }

    public void permutate(String word, ArrayList<String> lettersLeft){
        if(lettersLeft.size()==0){
            System.out.println(word);
        }else{
            for(int i=0;i<lettersLeft.size();i++){
                String newWord = new String();
                newWord = word+lettersLeft.get(i);
                lettersLeft.remove(i);
                permutate(newWord, lettersLeft);
            }
        }
    }
}
import java.util.*;
公共类所有置换{
ArrayList字母=新的ArrayList();
公共图书馆{
字母。添加(“H”);
信函。添加(“a”);
信函。添加(“s”);
置换(“,字母);
}
public void permutate(字符串字、ArrayList lettersLeft){
如果(lettersLeft.size()==0){
System.out.println(word);
}否则{

对于(int i=0;i您需要将删除的字母添加回lettersLeft列表

public void permutate(String word, ArrayList<String> lettersLeft){
    if(lettersLeft.size()==0){
        System.out.println(word);
    }else{
        for(int i=0;i<lettersLeft.size();i++){
            String temp = lettersLeft.remove(i);
            String  newWord = word+temp;
            permutate(newWord, lettersLeft);
            lettersLeft.add(i, temp);
        }
    }
}
public void permutate(字符串字,数组列表lettersLeft){
如果(lettersLeft.size()==0){
System.out.println(word);
}否则{

对于(int i=0;i这是因为
lettersLeft
总是通过引用传递。一旦从lettersLeft中删除字母,它将被永久删除。因此,对于第一次迭代,您有“HAS”打印出来。一旦完成,递归算法将备份一个级别以进行第二次迭代,但您知道吗??lettersLeft为空。因此,它终止时不会传递if语句,从而导致它无法获取另一个单词或置换。为了解决此问题,请创建一个本地副本,就像您对newWord所做的那样。希望这能有所帮助。

在这种情况下,您将从
数组列表中删除字母,它将变为空,直到到达第一个单词的结尾。然后,列表大小始终为零…
将删除的字母添加回列表中

我建议您使用下面的链接,找到字符串排列的好例子,因为有节省内存和节省空间的字符串排列解决方案


您是否需要复制
lettersLeft
列表,而不是直接修改它?能否举例说明您的期望和实际结果。您不应该有一个运行置换nPm次数的for循环吗?