全排列

作者: yuanxiaolan | 来源:发表于2017-06-21 13:53 被阅读0次

    两种方法:
    第一种方法:
    递归:

    • 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,
    • 从而得到所有元素的全排列。以对字符串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);
        }  
    }
    

    相关文章

      网友评论

          本文标题:全排列

          本文链接:https://www.haomeiwen.com/subject/izazqxtx.html