字符串的全排列和组合

字符串的全排列

/**
 * @ClassName TestDemo37
 * @Description 面38 全排列
 * @Author lzq
 * @Date 2019/1/5 20:54
 * @Version 1.0
 **/
public class TestDemo37 {
    public static int count = 0;  //记录排列的种树

    /**
     * 交换位置
     * @param chars
     * @param i
     * @param j
     */
    public static void swap(char[] chars,int i,int j){
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }

    /**
     * 全排列主方法
     * @param chars
     * @param k
     */
    public static void allPermutate(char[] chars,int k){
        if(k == chars.length-1){
            print(chars);
            count++;
        }else{
            for(int i = k;i < chars.length;i++){
                swap(chars,k,i);
                allPermutate(chars, k+1);
                swap(chars,k,i);
            }
        }
    }

    //打印
    public static void print(char[] chars) {
        for(int i = 0;i < chars.length;i++){
            System.out.print(chars[i]+"\t");
        }
        System.out.println();
    }

    //起始方法
    public static void Permutate(String str) {
        if(str == null || str.length() == 0) {
            return;
        }
        allPermutate(str.toCharArray(),0);
    }

   public static void main(String[] args) {
        String str = "ABC";
        Permutate(str);
        System.out.println(count);
    }
}

运行结果:

A	B	C	
A	C	B	
B	A	C	
B	C	A	
C	B	A	
C	A	B	
6

代码原理:
在这里插入图片描述

字符串的组合

/**
 * @ClassName TestDemo38
 * @Description 组合
 * @Author lzq
 * @Date 2019/1/6 1:34
 * @Version 1.0
 **/
public class TestDemo38 {
    public static void main(String[] args) {
        String str = "ABC";
        combination(str);
    }

    /**
     * 求字符串组合的主方法
     * @param s
     */
    public static void combination(String s) {
        char[] chars = s.toCharArray();
        StringBuffer str = new StringBuffer();
        core(chars,str,0);
    }

    /**
     * 求字符串组合的核心方法
     * @param chars
     * @param str
     * @param index
     */
    private static void core(char[] chars,StringBuffer str,int index) {
        if(index == chars.length) {
            System.out.println(str.toString());
            return;
        }
        str.append(chars[index]);   				//选取
        core(chars,str,index+1);   	//剩下的里面选len-1个
        str.deleteCharAt(str.length()-1); 	//删除
        core(chars,str,index+1);   	//剩下的里面选len个
    }

}

运行结果:

A 
B 
C 
AB 
AC 
BC 
ABC 

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值