Java实现组合C(m,n)

来源:互联网 发布:中国数据网 编辑:程序博客网 时间:2024/05/23 16:38

今天刚做完排列A(m,n)问题,又来个组合问题,开始以为差不多,后面发现还有有点差距的,话不多说,列出代码,以方便后面回顾。

package sky_100;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** *  * @author Benett * @date 2017年8月23日 下午11:45:24 * @version 1.0 */public class Combination {    public static void main(String[] args) {        String str = "dabc";        List<String> cr = getCombinationResult(2, stringFilter(str));        for(String s: cr){            System.out.println(s);        }    }    /**     * 对字符串中元素进行重排序     * 此外还可以在该方法对元素进行去重等     * @param str  原字符串     * @return  目标字符串     */    public static String stringFilter(String str){        char[] c = str.toCharArray();        Arrays.sort(c);        return new String(c);    }    /**     * 得到组合结果     * @param num   从N个数中选取num个数     * @param str   包含Ng个元素的字符串     * @return  组合结果     */    public static List<String> getCombinationResult(int num, String str) {        List<String> result = new ArrayList<String>();        if (num == 1) {            for (char c : str.toCharArray()) {                result.add(String.valueOf(c));            }            return result;        }        if (num >= str.length()) {            result.add(str);            return result;        }        int strlen = str.length();        for (int i = 0; i < (strlen - num + 1); i++) {            List<String> cr = getCombinationResult(num - 1, str.substring(i + 1));//从i+1处直至字符串末尾            char c = str.charAt(i);//得到上面被去掉的字符,进行组合            for (String s : cr) {                result.add(c + s);            }        }        return result;    }}