Java DFS查找子集的所有置换
给定一个没有重复字符的字符串,返回一个包含该字符串及其所有子集的所有排列的列表 例子Java DFS查找子集的所有置换,java,algorithm,depth-first-search,Java,Algorithm,Depth First Search,给定一个没有重复字符的字符串,返回一个包含该字符串及其所有子集的所有排列的列表 例子 Set=“abc”,所有排列为:[,“a”,“ab”,“abc”,“ac”,“acb”,“b”,“ba”,“bac”,“bc”,“bca”,“c”,“cb”,“cba”,“ca”,“cab”] 如果我把整个事情分成两部分,我知道怎么做: 查找所有子集 对于每个子集,查找所有置换 但是我想知道是否有一种方法可以编写DFS助手函数,只需一步就可以完成它。当然。这不是最快的方法,但它很简单,并且按字典顺序枚举,因此输
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, 0, 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;
}
}
private static void printPerms(字符[]集,int i){
System.out.println(新字符串(set,0,i));
对于(int j=i;ji;k--){
集合[k]=集合[k-1];
}
集合[i]=c;
打印头(套,i+1);
//将c移回位置j
对于(int k=i;k
请参见