Java 字符串置换
我最近试图编写一个脚本,用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");
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循环吗?