研究一下全排列算法,他奶奶的,我一看见递归我就晕,研究了许久还是有点模糊。慢慢来吧,数学太差了。
先贴上代码,省得以后用到的时候又忘了,希望对大家有帮助。
import java.io. * ;
import java.util. * ;
public class PaiLie {
public PaiLie() {
}
public static void main(String[] args) {
PaiLie p = new PaiLie();
while ( true ) {
Scanner r = new Scanner(System.in);
String s = r.nextLine();
if (s.equals( " exit " )) {
System.out.println( " bye bye... " );
break ;
}
System.out.println( " 开始排列字符串" " + s + " " " );
p.paiLie(s);
}
}
public void paiLie(String s) {
int t = s.length();
char [] charA = new char [t];
for ( int i = 0 ; i < t; i ++ ) {
charA[i] = s.charAt(i);
}
pl(charA, 0 );
}
private void pl( char [] ca, int deep) {
int t = ca.length;
int d = deep;
if (d == t - 1 ) {
System.out.println(ca);
return ;
}
for ( int i = deep; i < t; i ++ ) {
char temp = ca[deep];
ca[deep] = ca[i];
ca[i] = temp;
pl(ca, deep + 1 );
ca[i] = ca[deep];
ca[deep] = temp;
}
}
}
原理:
1 2 3 4 5
deep = 0 先用1 跟 1,2,3,4,5 交换位置,排列为
|
|
V
1,2,3,4,5
2,1,3,4,5
3,2,1,4,5
4,2,3,1,5
5,2,3,4,1
然后对每一个排列在从第二个位置开始重复上面的过程,以3,2,1,4,5为例:
deep = 1
|
|
V
2--2交换:3,2,1,4,5
2--1交换:3,1,2,4,5
2--4交换:3,4,1,2,5
2--5交换:3,5,1,4,2
再以3,4,1,2,5为例:
deep=2
|
|
V
1--1交换:3,4,1,2,5
1--2交换:3,4,2,1,5
1--5交换:3,4,5,2,1
以3,4,5,2,1为例:
deep=3
|
|
V
2--2交换:3,4,5,2,1
2--1交换:3,4,5,1,2
以3,4,5,1,2为例:
deep=4
|
|
V
2--2交换:3,4,5,1,2
deep=5
print_it;
return;