排列、组合问题(Java)

排列组合

1.排列

如abc的排列,输出abc,acb,bac,bca,cab,cba

    public ArrayList<String> Permutation(String str) {
        ArrayList<String> list = new ArrayList<String>();
        int len = str.length();
        if(str == null || len == 0){
            return list;
        }
        char[] chars = str.toCharArray();
        Permutation(chars,0,list);
        Collections.sort(list);
        return list;
    }

    public void Permutation(char[] chars,int beginIndex,ArrayList<String> list){
        if(beginIndex == chars.length ){
            list.add(new String(chars));
            return;
        }
        HashSet<Character> set = new HashSet<Character>();
        for(int i=beginIndex;i<chars.length;i++){
            if(!set.contains(chars[i])){
                set.add(chars[i]);
                swap(chars,beginIndex,i);
                Permutation(chars,beginIndex+1,list);
                swap(chars,beginIndex,i);
            }
        }
        return;
    }

2.组合

        组合是类似将abc分为abc、ab、bc、a、b、c这样的形式,输出元素数量从原本元素数n开始递减至1的排列。
分为两种情况:
1.第一个元素在组合中,则在n-1个元素中找m-1个
2.第一个元素不在组合中,则在n-1个元素中找m个

public static void combine(char chs[]){
    if(chs.length == 0) return ;

    Stack<Character> stack = new Stack<Character>();
    for(int i = 1; i <= chs.length; i++){
        combine(chs, 0, i, stack);
    }
}
//从字符数组中第begin个字符开始挑选number个字符加入stack中
public static void combine(char []chs, int begin, int number, Stack<Character> stack){
    if(number == 0){
        System.out.println(stack.toString());
        return ;
    }
    if(begin == chs.length){
        return;
    }
    stack.push(chs[begin]);
    combine(chs, begin + 1, number - 1, stack);
    stack.pop();
    combine(chs, begin + 1, number, stack);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值