题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
代码实现(Java)
import java.util.ArrayList;
import java.util.TreeSet;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> resList = new ArrayList<>();
if(str == null || str.length() == 0) return resList;
TreeSet<String> set = new TreeSet<>(); // TreeSet:默认使用元素的自然顺序进行排序
char[] charArr = str.toCharArray();
permutation(charArr, 0, set);
resList.addAll(set);
return resList;
}
private void permutation(char[] charArr, int begin, TreeSet<String> set){
if(charArr == null || charArr.length == 0 || begin < 0 || begin >= charArr.length) return;
//注意:begin == charArr.length - 1
if(begin == charArr.length - 1) set.add(String.valueOf(charArr));
else{
for(int i = begin;i < charArr.length;i++){
swap(charArr, i, begin);
permutation(charArr, begin + 1, set);
swap(charArr, i, begin);
}
}
}
private void swap(char[] charArr, int a, int b){
char tmp = charArr[a];
charArr[a] = charArr[b];
charArr[b] = tmp;
}
}
注:题目及其解法均来自牛客网–剑指offer