问题描述
我在书中发现了一段代码,声称可以打印带有所有不同字符的字符串的所有排列:-
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