按字典序排列字符串

分析过程

我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。

编码思想

列出第一位所有可能情况,然后后面的位就递归,第一位和每个位(包括第一位但不包括其他位和一相等的)交换,递归的结束条件就是第一位和最后一位交换完成

具体代码实现

    /**
    *    ch:字符串转化为的char数组
    *    begin:交换位置的索引
    *    set:用于存放字符串
    */
    public void Permutation(char[] ch,int begin,TreeSet<String> set){
        if(begin==ch.length-1)
            set.add(String.valueOf(ch));//递归结束的条件就是,第一位和最后一位交换完成
        for(int i=begin;i<ch.length;i++){//让第一位和每一位交换
            if(i!=begin && ch[i]==ch[begin])//如果第一位和非第一位重复了,就不交换了
                continue;
            swap(ch,begin,i);
            Permutation(ch,begin+1,set);//递归,第一位固定了,将除了第一位,后面的字符串全排序。
            swap(ch,begin,i);//交换完成还要换回来,保证第一位不变
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值