问题描述:
给定某些字符,“1,2,3,4”。求它们的全排列组合。
样例:
(1,2,3,4,5)的全排列前五种为:
①1,2,3,4,5 ②1,2,3,5,4 ③1,2,4,3,5 ④1,2,4,5,3 ⑤1,2,5,3,4
解决思路:
可以通过深度优先搜索求全排列问题:
通过维护一个标志数组,标志某一元素是否已经出现过,在求某一种全排列时,可以一位一位求解,当第一位满足时,则递归到第二位,递归到第三位……当然在递归中要注意及时回溯,将新加的字符删掉,标志的数组值重置。
问题扩展:
①当给定字符中有重复数字时,求全排列。
②当给定字符为无规律字符时,求全排列。
java代码:
public class Permutation {
public static void main(String[] args) {
DfsPer obj = new DfsPer();
obj.dfs(0);
}
}
class DfsPer{
char[] c = new char[]{'1', '2', '3', '4'};//全排列元素
int len = c.length;
boolean visited[] = new boolean[5];//标志数组
StringBuilder builder = new StringBuilder();//用于拼接最终结果
public void dfs(int step) {//step表示当前选第step个数字
if(step == len) {//已经选好了所有元素
System.out.println(builder.toString());
return;
}
for(int i = 0; i < len; i++) {
if(!visited[i]) {//第i个元素还没有出现
visited[i] = true;
builder.append(c[i]);
dfs(step + 1);//继续找下一位元素
visited[i] = false;//回溯,恢复上步状态
builder.deleteCharAt(builder.length() - 1);
}
}
}
}
程序输出:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321