題目描述:
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
解析:題目要求,按照字典順序打印,而且輸入的字符串中還可能有重複數字,因此考慮是用TreeSet這一數據結構。此題我解決全排列的問題使用的是遞歸的方式,大家也可以使用非遞歸的方式求解。非遞歸的具體實現可以參看這篇文章:非遞歸求解全排列
參考代碼如下:
import java.util.ArrayList;
import java.util.TreeSet;
public class Main {
public static ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<String>();
TreeSet<String> set = new TreeSet<>();//用TreeSet保證去重和排序
char[] array = str.toCharArray();
int begin = 0;
int end = array.length - 1;
Permu(set, array, begin, end);
for(String s : set){
result.add(s);
}
return result;
}
private static void Permu(TreeSet<String> set, char[] array, int begin, int end) {
if(begin == end){//找到一個排列
set.add(new String(array));
return;
}else{
for(int i = begin; i < array.length; i++){
swap(array, begin, i);
Permu(set, array, begin + 1, end);
swap(array, begin, i);
}
}
}
private static void swap(char[] array, int begin, int i) {
char temp = array[begin];
array[begin] = array[i];
array[i] = temp;
}
public static void main(String[] args) {
TreeNode root = null;
String s = "abc";
System.out.println(Permutation(s));
}
}