class AnagramApp {
static char[] arrChar;
static int size;
public static void main(String[] args) {
String input = "abc";
arrChar =input.toCharArray();
size =input.length();
doAnagram(input.length());
}
public static void doAnagram(int newSize) {
if (newSize == 1)
return;
for (int j = 0; j < newSize; j++) {
doAnagram(newSize - 1);
if (newSize == 2)
displayWord();
rotate(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];
//j++了
arrChar[j - 1] = temp;
}
public static void displayWord() {
System.out.println(new String(arrChar) +"\t");
}
}
//以上代码看不懂,如何实现的,想要知道思路,不是一点一点运行的分析,
想知道这个人是怎么推理出来要这样做的,
简单来说,全排列算法用递归可以这么描述:
如果是一个元素排列,那么只有一个情况
如果有n个元素排列(n>2),这个问题可以分为
先选取这个元素中的某一个作为开头,每种情况搭配对(n-1)个元素全排列的情况。
/*
2、数字全排列(numlist.pas/in/out)
列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入一个整数n(1≤n≤9)输出由1~n组成的所有不重复的数字序列,每行一个序列,数字与数字之间用空格隔开,行首行尾不留空格。
样例输入:numlist.in3
样例输出:numlist.out
1 2 3
1 3 2
2 1......
答案就在这里:递归算法之全排列问题
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?
比如全排列abc
可以用如下递归:
a开头,排列bc
b开头,排列ac
c开头,排列ab
对于排列bc,它就是
b开头,排列c
c开头,排列b
对于排列c,因为只有一个元素,所以就是直接返回c
同理,排列b,返回b
所以排列bc得到
bc
cb
a开头的就是
abc
acb
以此类推,得到
bac
bca
cab
cba
如果排列abcd呢?可以划归为
a
b
c
d开头,分别去搭配
bcd acd abd abc
重点在于旋转函数的处理rotate(int newSize),
比如abcde
ab 保持不变,cde旋转得到dec,ecd,cde,可以得到{abdec,abecd,abcde},
然后a不变,bcde旋转{cdeb,debc,ebcd,bcde},即{acdeb,adebc,aebcd,abcde}
abcde旋转bcdea
依次在进行