标题:全排列
对于某个串,比如:“1234”,求它的所有全排列。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。
// 轮换前k个,再递归处理
import java.util.*;
public class A
{
static void permu(char[] data, int cur){
if(cur==data.length-1){
System.out.println(new String(data));
return;
}
for(int i=cur; i<data.length; i++){
char tmp = data[i];
for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
data[cur] = tmp;
permu(data, cur+1);
tmp = data[cur];
__________________________________________ ;
data[i] = tmp;
}
}
static void permu(String x){
permu(x.toCharArray(),0);
}
public static void main(String[] args){
permu("1234");
}
}
请注意:只需要填写划线部分缺少的内容,不要抄写已有的代码或符号。
解题思路:考察全排列基础知识,写过全排列知道思想顺着推就行。
正常全排列代码
public class QuanPaiLieText {
public static void main(String[] args) {
// TODO Auto-generated method stub
QuanPaiLie(new char[] {'a','b','c'},0);
}
public static void QuanPaiLie(char[] c,int i) {
if(c==null||i<0||i>c.length)
return;
if(i==c.length-1) {
System.out.println(new String(c));
}else {
for (int j = i; j < c.length; j++) {
char temp=c[i];
c[i]=c[j];
c[j]=temp;
QuanPaiLie(c, i+1);
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
}
对比就可以推出答案:
for(int i=cur; i<data.length; i++){
char tmp = data[i];
for(int j=i-1; j>=cur; j--) data[j+1] = data[j];//这里等价于data[i]=data[cur];
data[cur] = tmp;
permu(data, cur+1);
tmp = data[cur];
for(int j=cur; j<=i-1; j++) data[j] = data[j+1];//这里等价于data[cur]=data[i];
data[i] = tmp;
}
答案:for(int j=cur; j<=i-1; j++) data[j] = data[j+1];