一、问题描述
给定一个字符串数组,打印该字符串数组中所有元素的全排列。
例如,字符串数组 [“Are”, “You”, “Ok”] 的全排列为:
1. [“Are”, “You”, “Ok”]
2. [“Are”, “Ok”, “You”]
3. [“You”, “Are”, “Ok”]
4. [“You”, “Ok”, “Are”]
5. [“Ok”, “You”, “Are”]
6. [“Ok”, “Are”, “You”]
总共有6种排列的输出。
二、思路
采用递归的方式求解。
每次先选定一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来。至此,一趟全排列完成。第二趟,选定下一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来。…..
三、代码
import java.util.ArrayList;
import java.util.List;
/**
* Java实现全排列
* @author tao
*
*/
public class Permutation {
/**
* 字符串数组元素的全排列
* @param strArray 字符串数组
*/
public static void allPermutation(String[] strArray) {
if (null == strArray || 0 == strArray.length) {
return;
}
// 保存所有的全排列
List<String[]> res = new ArrayList<>();
// 全排列
allPermutation(strArray, res, 0);
// 打印
print(res);
}
/**
* 全排列的核心函数,递归调用
* @param strArray 字符串数组
* @param res 结果集合
* @param start 圈定的起始位置
*/
private static void allPermutation(String[] strArray, List<String[]> res, int start) {
if (start == strArray.length-1) {
// 这里有个坑,注意保存这一趟全排列的结果的时候,要复制当前的String[]数组
res.add(strArray.clone());
} else {
for (int i = start; i <= strArray.length-1; i++) {
// 相当于固定第i个字符串元素
swap(strArray, i, start);
// 递归求这种情况下的全排列
allPermutation(strArray, res, start+1);
// 复位
swap(strArray, start, i);
}
}
}
/**
* 交换函数
* @param arr
* @param i
* @param j
*/
private static void swap(String[] arr, int i, int j) {
String temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 打印函数
* @param res 结果集合
*/
private static void print(List<String[]> res) {
for (String[] arr : res) {
for (String s : arr) {
System.out.print(s + " ");
}
System.out.println();
}
System.out.println("size: " + res.size());
}
/**
* main函数
* @param args
*/
public static void main(String[] args) {
String sentence = "Are You Ok";
String[] arr = sentence.split(" ");
System.out.println(arr.length);
Permutation.allPermutation(arr);
}
}