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
    请参见