问题: 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;
实现代码:
import java.util.ArrayList;
/**
* 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;
*
*/
public class Test4 {
static ArrayList<String> list = new ArrayList<String>();
public static void main(String[] args) {
char buf[] = { '1', '2', '3', '4' };
sort(buf, 0, buf.length - 1);
System.out.println(list.toString());
}
public static void sort(char[] data, int start, int end) {
// 递归的结束条件
if (start == end) {
list.add(new String(data));
} else {
for (int i = start; i <= end; i++) {
//处理数组中相同的元素
if (data[i] == data[start] && i != start) {
continue;
} else {
// 交换数组第一个元素与后续的元素
swap(data, i, start);
// 后续元素递归全排列
sort(data, start + 1, end);
// 将交换后的数组还原
swap(data, i, start);
}
}
}
}
// 交换数组中不同位置的值
public static void swap(char[] data, int i, int j) {
char temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
实现思路如下:
首先能想到的便是递归的方式,但递归的思路有好多种,这只是其中一种。
这种思路是:分别计算第i个数据排在第一位的时候,其他n-1个数据的全排列,而n-1的全排列和n的全排列又是完全一样的,一直到只有一个数据时,也就是递归的结束条件。
如数字1234全排列,首先将1固定,对234进行全排列,而对234排列,将2固定,对34进行全排列,依次进行。
如果不考虑重复,还有一些不错的递归实现方式(以下均是转载):
转载自CSDN,作者 preferme (冰思雨) ,具体地址忘记了:
import java.util.ArrayList;
import java.util.List;
/**
* 转载自CSDN,作者是 冰思雨
* @author preferme
*
*/
public class Test1 {
public static void main(String[] args) {
String s = "1245";
List<String> result = new ArrayList<String>();
list(s, "", result);
System.out.println(result.size());
System.out.println(result);
}
/**
* 列出基础字符串(base)的所有组合
*
* @param base
* 以该字符串作为基础字符串,进行选择性组合。
* @param buff
* 所求字符串的临时结果
* @param result
* 存放所求结果
*/
public static void list(String base, String buff, List<String> result) {
if (base.length() <= 0) {
result.add(buff);
}
for (int i = 0; i < base.length(); i++) {
list(new StringBuilder(base).deleteCharAt(i).toString(), buff
+ base.charAt(i), result);
}
}
}
另一种方式累死(忘记转载自哪里了):
public static void main(String[] args) {
String[] datas = new String[] { "1", "2", "3","4" };
sort(Arrays.asList(datas), new ArrayList<String>());
}
private static void sort(List<String> datas, List<String> target) {
if (target.size() == 4) { // 这个4表示要对几个字符进行全排列
for (Object obj : target)
System.out.print(obj);
System.out.println();
return;
}
for (int i = 0; i < datas.size(); i++) {
List<String> newDatas = new ArrayList<String>(datas);
List<String> newTarget = new ArrayList<String>(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sort(newDatas, newTarget);
}
}