两种方法:
第一种方法:
递归:
- 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,
- 从而得到所有元素的全排列。以对字符串abc进行全排列为例,我们可以这么做:以abc为例:
- 固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac
- 固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba
- 固定c,求后面ba的排列:cba,cab。
- 即递归树:
str: a b c
ab ac ba bc ca cb
result: abc acb bac bca cab cba
*/
//如果有重复元素,将结果存到hashSet中去重
public class Permutation {
public static void permutation(String str,String result){
if(result.length()==str.length()){
System.out.println(result);
}else{
for(int i=0;i<str.length();i++){
if(result.indexOf(str.charAt(i))<0){
permutation(str,result+str.charAt(i));
}
}
}
}
public static void main(String[] args){
String str="abc";
String result="";
permutation(str,result);
}
}
第二种方法:
/*递归另一种写法:
从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,
- 从而得到所有元素的全排列。以对字符串abc进行全排列为例,我们可以这么做:以abc为例:
- 固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac
- 固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba
- 固定c,求后面ba的排列:cba,cab。
public class Pass {
HashSet<String> set = new HashSet<String>();
public void Permutation(char[] c,int begin){
if(c.length==0)
return;
if(begin==c.length-1){
System.out.println(c);
}else{
for(int i=begin;i<c.length;i++){
Swap(c,i,begin);
Permutation(c,begin+1);//固定好当前一位,继续排列后面的
Swap(c,i,begin);
}
}
}
public void Swap(char[] c,int i,int begin){
if(i!=begin){
char temp=c[i];
c[i]=c[begin];
c[begin]=temp;
}
}
public static void main(String[] args) {
Pass ps=new Pass();
char[] c={'a','b','c'};
ps.Permutation(c,0);
}
}