【剑指offer-Java版】28字符串的排列

字符串的全排列:全排列问题刚刚做过,而且解决方法不止一种

递归,多想想


    public class _Q28<T> {

    private int count = 0;

    public void Premutation(char chars[], int begin){
        if(chars == null) return;

        if(chars.length == 0 || begin < 0) return;

        int end = chars.length - 1;
        if(begin == end){
            count++;
            System.out.print(count+" : ");
            System.out.println(chars);
        }else{
            for(int i=begin; i<=end; i++){
                char c = chars[begin]; // 第一步,找出所有可以出现在首位的字符
                chars[begin] = chars[i];
                chars[i] = c;

                Premutation(chars, begin+1); // 第二步,递归的求出后半部分的全排列

                c = chars[begin];
                chars[begin] = chars[i]; // 第一步的后半部分,恢复数组
                chars[i] = c;
            }
        }
    }

    /**
     * 
     * @comment TODO
     * @param chars 
     * @param m 排列的长度 -- 如果需要输出指定字符数组的全排列,那么直接使用for循环,使m 从0到数组长度即可
     * @param result   排列结果链表
     * @return void  
     * @throws
     * @date 2016年4月16日 下午4:20:57
     */
    public void Combination(char chars[], int m, List<Character> result){

        if(chars == null || result == null) return;

        if(m == 0){
            System.out.println(result);
            return;
        }

        if(chars.length > 0){
            // 包含当前第一个字符 -- 从剩下的字符中选出 m-1个
            result.add(chars[0]);
            Combination(Arrays.copyOfRange(chars, 1, chars.length), m-1, result);

            // 不包含当前第一个字符 -- 从剩下的字符中选出m 个
            result.remove(result.size()-1);
            Combination(Arrays.copyOfRange(chars, 1, chars.length), m, result);
        } 

    }
    }

测试代码


    public class _Q28Test extends TestCase {

    _Q28 premutation = new _Q28();

    public void test(){
        String str = "abcd";
        char chars[] = str.toCharArray();

        premutation.Premutation(chars, 0);

        List<Character> result = new ArrayList<>();
        premutation.Combination(chars, 2, result);
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值