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