字符全排列算法

来源:互联网 发布:数据帧 格式 编辑:程序博客网 时间:2024/06/05 02:17

递归思想:

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    }}





原创粉丝点击