如何查找具有所有不同字符的字符串的排列?

问题描述

我在书中发现了一段代码,声称可以打印带有所有不同字符的字符串的所有排列:-

void permutation(String str) {
    permutation(str,"");
}
    
void permutation(String str,String prefix) {
    if (str.length() == 0) {
        System.out.println(prefix);
    } else {
        for (int i = 0; i < str.length(); i++) {
            String rem = str.substring(0,i) + str.substring(i + 1);
            permutation(rem,prefix + str.charat(i));
        }
    }
}

代码中rem变量的作用是什么?

解决方法

您可以可视化该过程。

static int indent = 0;
static String indent(int i) { return "  ".repeat(i); }

void permutation(String str) {
    System.out.println("permutation(\"" + str + "\")");
    ++indent;
    permutation(str,"");
}


void permutation(String str,String prefix) {
    System.out.println(indent(indent) + "permutation(\"" + str + "\",\"" + prefix + "\")");
    if (str.length() == 0) {
        System.out.println(indent(indent + 1) + "--> "+ prefix);
    } else {
        for (int i = 0; i < str.length(); i++) {
            String rem = str.substring(0,i) + str.substring(i + 1);
            ++indent;
            permutation(rem,prefix + str.charAt(i));
            --indent;
        }
    }
}

permutation("abc");

输出

permutation("abc")
  permutation("abc","")
    permutation("bc","a")
      permutation("c","ab")
        permutation("","abc")
          --> abc
      permutation("b","ac")
        permutation("","acb")
          --> acb
    permutation("ac","b")
      permutation("c","ba")
        permutation("","bac")
          --> bac
      permutation("a","bc")
        permutation("","bca")
          --> bca
    permutation("ab","c")
      permutation("b","ca")
        permutation("","cab")
          --> cab
      permutation("a","cb")
        permutation("","cba")
          --> cba