字符全排列算法

递归思想:

1:最少的情况是一个字符全排列,直接就是。

2:两个字符全排列的时候,两个要做的是互换位置,相当于当前串首字符和整个arr尾字符互换,两个字母时一次即可。

3:三个字符的时候,第一个字母位置不变,剩下两个字母执行第二步。同时每个字符都有一次机会放在最左端(第一位)。循环执行当前串首字符和整个arr尾字符互换操作。

4:大于三个字符(n)的也是保证每个字符都有机会放在最左端,同时剩余的字符执行fun(n-1)


定义属性:

static char[] arrChar = {'c','a','t','s'};
static int size = arrChar.length;


main:

doAnagram(size);


递归方法:

public static void doAnagram(int newSize){
	//TODO:递归实现
	//1:边界,递归结束
	//2:递归调用
	//3:其他操作
}


显示单词所有组合:

public static void display(char[] arr){
     //TODO:打印字符串。
}

当前串首字符和整个arr尾字符互换:

public static void rotate(int newSize){
	//TODO:将每次递归的数组的首字符和原始数组的尾字符调换
}



完整代码:

public class Anagram {

    static char[] arrChar = {'c','a','t','s'};
    static int size = arrChar.length;

    public static void main(String[] args) {
           doAnagram(size);
    }

    public static void doAnagram(int newSize){
        if (newSize == 1){
            displayWord(arrChar);
        }else {
            for (int j=0;j<newSize;j++){
                doAnagram(newSize - 1);
                rotate(newSize);
            }
        }

    }

    /**
     * 显示所有单词组合
     * */
    public static void displayWord(char[] arr){
        for (char ch:arr){
            System.out.print(ch);
        }
        System.out.println("");
    }

    /**
     *newSize是递归中的数字
     *
     * */
    public static void rotate(int newSize){
        int j;
        int position = size - newSize;
        char temp = arrChar[position];
        for (j=position+1;j<size;j++){
            arrChar[j-1] = arrChar[j];//left moved
        }
        arrChar[j-1] = temp;//put first on right
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值