问题描述
给出一个没有重复字符的字符串,返回一个包含字符串及其所有子集的所有排列的列表。
示例
Set = "abc"
,所有排列为:["","a","ab","abc","ac","acb","b","ba","bac","bc","bca","c","cb","cba","ca","cab"]
。
如果我将整个事情分为两部分,我知道该怎么做:
- 找到所有子集
- 对于每个子集,找到所有排列
但是我想知道是否有一种方法可以编写DFS辅助函数,仅一步就可以完成。
解决方法
好的。这不是最快的方法,但它很简单,并且按字典顺序枚举,以使输入字符串是最小排列。
private static void printPerms(char[] set,int i) {
System.out.println(new String(set,i));
for (int j = i; j < set.length; j++) {
char c = set[j];
// move c to position i
for (int k = j; k > i; k--) {
set[k] = set[k - 1];
}
set[i] = c;
printPerms(set,i + 1);
// move c back to position j
for (int k = i; k < j; k++) {
set[k] = set[k + 1];
}
set[j] = c;
}
}