DFS查找子集的所有排列

问题描述

给出一个没有重复字符的字符串,返回一个包含字符串及其所有子集的所有排列的列表。

示例

Set = "abc",所有排列为:["","a","ab","abc","ac","acb","b","ba","bac","bc","bca","c","cb","cba","ca","cab"]

如果我将整个事情分为两部分,我知道该怎么做:

  1. 找到所有子集
  2. 对于每个子集,找到所有排列

但是我想知道是否有一种方法可以编写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;
  }
}