我在java中搜索了代码以进行排列:
public class MainClass {
public static void main(String args[]) {
permuteString("", "String");
}
public static void permuteString(String beginningString, String endingString) {
if (endingString.length() <= 1)
System.out.println(beginningString + endingString);
else
for (int i = 0; i < endingString.length(); i++) {
try {
String newString = endingString.substring(0, i) + endingString.substring(i + 1);
permuteString(beginningString + endingString.charAt(i), newString);
} catch (StringIndexOutOfBoundsException exception) {
exception.printStackTrace();
}
}
}
}
即使我知道它只是一个基本代码,我也无法理解。我希望有人向我解释,以使其更清楚。谢谢你们
答案 0 :(得分:1)
可以通过重复从包中选择项来构造排列,从而构建序列。对于字符串,包是一组字符。我们可以使用String
来表示这一点。
如果我们想构建一个随机置换字符串,我们首先看一下这个包是否为空。在上面的代码中,包是endingString
,空白检查是通过以下方式完成的:
if (endingString.length() <= 1)
System.out.println(beginningString + endingString);
正如你所看到的那样,检查看不到包是否完全是空的:从字符串只有一个字符(一个元素)的那一刻起,显然我们会选择那一个。所以我们选择它并在我们已经构建的序列之后打印它。
问题:这种方法的一个问题是,如果我们要列出空字符串的排列(只有一个:空字符串),就会出错。
现在我们需要迭代案例。请记住,beginningString
存储了我们迄今为止构建的序列,endingString
存储了我们仍然可以选择的字符列表。现在,选择的方法是在i
中选择有效的索引endingString
。然后选择该索引处的字符。
我们只需附加beginningString
处放置的字符即可更新序列i
,因此:
beginningString + endingString.charAt(i)
为了更新行李,这意味着行李现在包含索引之前的所有字符以及索引之后的字符。这被正式化为:
String newString = endingString.substring(0, i) + endingString.substring(i + 1);
newString
在这里是新包。然后我们可以进行递归调用以从包中挑选下一个项目。因此,对于给定的索引i
,为了递归选择和调用,代码为:
String newString = endingString.substring(0, i) + endingString.substring(i + 1);
permuteString(beginningString + endingString.charAt(i), newString);
现在,由于我们希望枚举所有可能的排列,我们循环遍历i
的所有可能索引。由于我们以递归的方式执行此操作,因此我们将枚举所有排列。