packagedigui;importjava.util.ArrayList;importjava.util.List;publicclassStringArrange{publicstaticListarrange(Stringstr){Listresults=newArrayList()...
package digui;
import java.util.ArrayList;
import java.util.List;
public class StringArrange{
public static List arrange(String str){
List results =new ArrayList();
arrange(str,"",results);
return results;
}
public static void arrange(String notarranged,String arranged,List results){
if(notarranged.length()==0){
System.out.println(arranged);
results.add(arranged);
return ;
}else{
//从notarranged 取一个字符 给 arranged
for( int i=0;i
StringBuilder sb =new StringBuilder(notarranged);
String chart =""+sb.charAt(i);
notarranged=sb.deleteCharAt(i).toString();
arranged =arranged+chart;
arrange(notarranged,arranged,results);
}
}
}
public static void main(String[] args) {
List results =arrange("ab");
}
}
我的思路是An = n*A(n-1)
An的全排列 =
for 从未排列的元素中 取一个
,然后对剩下的进行全排列 A(n-1)
终止条件是剩下的元素为空
我的算法到底哪里出错了?
我调试时 最上面的一层根本不循环。
原来我的问题出在
for( int i=0;i
StringBuilder sb =new StringBuilder(notarranged);
String chart =""+sb.charAt(i);
String newnotarranged=sb.deleteCharAt(i).toString();
String newarranged =arranged+chart;
arrange(newnotarranged,newarranged,results);
}
}
newnotarranged newarranged 必须要重新命名,否则 for 循环的值 在循环体内被改变,导致下次循环条件不满足了。
这提醒了我们for循环的条件边界应该是不变的。就是不能被方法体修改,而i值可以变化
展开