递归思想:
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
}
}