回溯算法
题目描述
对给定的n位字符串全排列
解题思路
n位的字符串的全排列,先确定第0位,然后对后面n-1位进行全排列,在对n-1为进行全排列时,先确定第1位,然后对后面的n-2位进行全排列...由此得到递归函数和递归的结束条件。全排列也就是交换位置,到n-2位时,就是将n-2和n-1交换位置。
// String[] res
// allSort(res,0);
public static void allSort(String[] res,int pos){
int len = res.length;
if (pos == len-1){
System.out.println(Arrays.toString(res));
}else {
for (int i=pos;i<len;i++){
swap(res,pos,i);
allSort(res,pos+1);
swap(res,pos,i);
}
}
}
public static void swap(String[] res,int pos, int i){
String str = res[pos];
res[pos] = res[i];
res[i] = str;
}
public static void main(String[] args) {
String[] arr = {"1","2","3"};
String path = "";
fullarr(arr,0,path);
}
public static void fullarr(String [] arr,int start,String path) {
if (start == arr.length-1){
// 也可以直接输出数组
// System.out.println(Arrays.toString(arr));
System.out.println(path + arr[start]);
}else {
for(int i=start;i<arr.length;i++) {
String temp = path;
path = path + arr[i];
swap(arr, start, i);
fullarr(arr, start+1,path);
// 回溯
path = temp;
// 对之前交换过的数据进行还原
swap(arr, start, i);
}
}
}
public static void swap(String []arr,int start,int end) {
String temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
public static void fullarr(int []arr,int start,int end) {
if (start==end) {
System.out.println(Arrays.toString(arr));
}else {
for(int i=start;i<end;i++) {
swap(arr, start, i);
fullarr(arr, start+1, end);
// 回溯
// 对之前交换过的数据进行还原
swap(arr, start, i);
}
}
}
网友评论