zoukankan      html  css  js  c++  java
  • 排列与组合的Java递归实现 (参考)

    我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子:

    (1)关于字符串排列的问题

    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符abc所能排列出来的所有字符串abcacbbacbcacabcba

    可以这样想:固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把ba交换回来。在交换ba之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符ba的排列。这样写成递归程序如下:

    public class Permutation {  
        public static void permutation(char[]ss,int i){  
            if(ss==null||i<0 ||i>ss.length){  
                return;  
            }  
            if(i==ss.length){  
                System.out.println(new String(ss));  
            }else{  
                for(int j=i;j<ss.length;j++){  
                    char temp=ss[j];//交换前缀,使之产生下一个前缀  
                    ss[j]=ss[i];  
                    ss[i]=temp;  
                    permutation(ss,i+1);  
                    temp=ss[j]; //将前缀换回来,继续做上一个的前缀排列.  
                    ss[j]=ss[i];  
                    ss[i]=temp;  
                }  
            }  
        }  
        public static void main(String args[]){  
            char []ss={'a','c','b','d'};  
            permutation(ss,0);  
        }  
    } 

    (2)关于组合的问题

    输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

    假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。

    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.Queue;  
    public class Combination {  
        public static void combiantion(char chs[]){  
            if(chs==null||chs.length==0){  
                return ;  
            }  
            List<Character> list=new ArrayList();  
            for(int i=1;i<=chs.length;i++){  
                combine(chs,0,i,list);  
            }  
        }  
        //从字符数组中第begin个字符开始挑选number个字符加入list中  
        public static void combine(char []cs,int begin,int number,List<Character> list){  
            if(number==0){  
                System.out.println(list.toString());  
                return ;  
            }  
            if(begin==cs.length){  
                return;  
            }  
            list.add(cs[begin]);  
            combine(cs,begin+1,number-1,list);  
            list.remove((Character)cs[begin]);  
            combine(cs,begin+1,number,list);  
        }  
        public static void main(String args[]){  
            char chs[]={'a','b','c'};  
            combiantion(chs);  
        }  
    }  
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/longhs/p/3135433.html
Copyright © 2011-2022 走看看