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

Java 如何查找具有所有不同字符的字符串的排列?,java,string,recursion,Java,String,Recursion,我在一本书中发现了一段代码,它声称可以打印所有不同字符的字符串排列:- void permutation(String str) { permutation(str, ""); } void permutation(String str, String prefix) { if (str.length() == 0) { System.out.println(prefix); } else { for (int

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

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));
        }
    }
}
void置换(字符串str){
排列(str,“”);
}
无效排列(字符串str、字符串前缀){
如果(str.length()==0){
System.out.println(前缀);
}否则{
对于(int i=0;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("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

取一个类似于
“abc”
的字符串,并在函数中使用它。试着理解代码中的每一步。拿一张纸,写下部分结果。你知道方法
置换(String,String)
在某些条件下用调整后的参数调用自己,不是吗?我不理解字符串rem=something。为什么需要这个rem?@Jeet它不是“必需的”,但这个临时变量使代码更具可读性。你可以在
permutation
-调用中写入所有内容,但这将是一个相当长的语句。检查:
str.substring(0,i)+str.substring(i+1)
实际上给出了
str
,并删除了
i
的第个字符。
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