解释这种排列是如何工作的

时间:2015-05-15 02:44:57

标签: java

我在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();
    }
  }
 }
}

即使我知道它只是一个基本代码,我也无法理解。我希望有人向我解释,以使其更清楚。谢谢你们

1 个答案:

答案 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的所有可能索引。由于我们以递归的方式执行此操作,因此我们将枚举所有排列。