Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的排列字符串。请解释一下?_Java_String_Recursion - Fatal编程技术网

Java中的排列字符串。请解释一下?

Java中的排列字符串。请解释一下?,java,string,recursion,Java,String,Recursion,我一直在阅读一本书中的一个例子,该书向您展示了如何将字符串转换为所有可能的组合,但由于我还是一个编程初学者,所以我无法真正理解代码是如何工作的 有人能分析一下我提供的代码,并给我一个彻底的解释,每件事都做什么,它是如何做的 非常感谢, 亚历克斯 class PermuteString{ 字符串字; 整数指数; 磁阻子串发生器; 公共PermuteString(字符串s){ word=s; 指数=0; 如果(s.长度()>1){ 子字符串生成器=新的置换字符串(s.子字符串(1)); } } 公共

我一直在阅读一本书中的一个例子,该书向您展示了如何将字符串转换为所有可能的组合,但由于我还是一个编程初学者,所以我无法真正理解代码是如何工作的

有人能分析一下我提供的代码,并给我一个彻底的解释,每件事都做什么,它是如何做的

非常感谢,

亚历克斯

class PermuteString{
字符串字;
整数指数;
磁阻子串发生器;
公共PermuteString(字符串s){
word=s;
指数=0;
如果(s.长度()>1){
子字符串生成器=新的置换字符串(s.子字符串(1));
}
}
公共字符串nextpermutate(){
if(word.length()==1){
++指数;
返回词;
}
否则{
字符串r=word.charAt(索引)+substringGenerator.nextpermutat();
if(!substringGenerator.morePermutations()){
++指数;
if(索引
要生成置换,通常有两种方法

  • 排名和取消排名
  • 增量变更方法
  • 此例程使用增量更改方法。基本上,它选择一些元素的顺序(与开始的顺序相同),然后上下移动一个选项树,方法是将一个元素洗牌,然后递归地生成它下面所需的子排列

    permutation(everything) expands to
    
    (select 1) + permutation(everything but 1)
    (select 2) + permutation(everything but 2)
    (select 3) + permutation(everything but 3)
    ...
    (select n) + permutation(everything but n)
    
    and
    
    permuation(one item) expands to
    (select item)
    
    这由
    morePermutations()
    控制,如果嵌套的
    PermuteString
    类中只有一个元素,则返回false

    如果
    PermuteString
    中有两个或多个字符,
    索引
    将跟踪所选项目,并在移动索引时构造新的子
    PermuteString
    s

    当被要求进行下一次排列时,请求沿着嵌套的
    PermuteString
    s向下移动,直到一个字符串检测到它的子项没有“下一次”排列,这样父项更新它的索引,并用一个现在只缺少“new”
    index
    字符的新子项替换它以前的子项

    (为了完整性起见,对排名和联合国排名进行高级描述)

    分级和取消分级的工作方式不同。一个人知道特定大小的所有可能排列的计数,因此您可以创建一个排列映射到该大小内的“索引”。然后创建从该索引到值的反向映射。然后,一个高级示例将如下所示

    the entire map for 3 items (6 permutations) would look like
    
    (a, b, c) <=> 0
    (a, c, b) <=> 1
    (b, a, c) <=> 2
    (b, c, a) <=> 3
    (c, a, b) <=> 4
    (c, b, a) <=> 5
    
    (a, b, c) => 0
    to find the next, just add one
    0 + 1 => 1
    1 => (a, c, b)
    
    3个项目(6个排列)的整个地图如下所示
    (a、b、c)0
    (a、c、b)1
    (b、a、c)2
    (b、c、a)3
    (c、a、b)4
    (c、b、a)5
    (a,b,c)=>0
    要找到下一个,只需添加一个
    0 + 1 => 1
    1=>(a、c、b)
    

    有一些正式的数学方法可以在不在内存中维护映射的情况下映射未映射的置换,但它们通常不被使用,因为索引增长非常快,通常在数量超过MAX_INT时产生问题。

    要生成置换,通常有两种方法

  • 排名和取消排名
  • 增量变更方法
  • 此例程使用增量更改方法。基本上,它选择一些元素的顺序(与开始的顺序相同),然后上下移动一个选项树,方法是将一个元素洗牌,然后递归地生成它下面所需的子排列

    permutation(everything) expands to
    
    (select 1) + permutation(everything but 1)
    (select 2) + permutation(everything but 2)
    (select 3) + permutation(everything but 3)
    ...
    (select n) + permutation(everything but n)
    
    and
    
    permuation(one item) expands to
    (select item)
    
    这由
    morePermutations()
    控制,如果嵌套的
    PermuteString
    类中只有一个元素,则返回false

    如果
    PermuteString
    中有两个或多个字符,
    索引
    将跟踪所选项目,并在移动索引时构造新的子
    PermuteString
    s

    当被要求进行下一次排列时,请求沿着嵌套的
    PermuteString
    s向下移动,直到一个字符串检测到它的子项没有“下一次”排列,这样父项更新它的索引,并用一个现在只缺少“new”
    index
    字符的新子项替换它以前的子项

    (为了完整性起见,对排名和联合国排名进行高级描述)

    分级和取消分级的工作方式不同。一个人知道特定大小的所有可能排列的计数,因此您可以创建一个排列映射到该大小内的“索引”。然后创建从该索引到值的反向映射。然后,一个高级示例将如下所示

    the entire map for 3 items (6 permutations) would look like
    
    (a, b, c) <=> 0
    (a, c, b) <=> 1
    (b, a, c) <=> 2
    (b, c, a) <=> 3
    (c, a, b) <=> 4
    (c, b, a) <=> 5
    
    (a, b, c) => 0
    to find the next, just add one
    0 + 1 => 1
    1 => (a, c, b)
    
    3个项目(6个排列)的整个地图如下所示
    (a、b、c)0
    (a、c、b)1
    (b、a、c)2
    (b、c、a)3
    (c、a、b)4
    (c、b、a)5
    (a,b,c)=>0
    要找到下一个,只需添加一个
    0 + 1 => 1
    1=>(a、c、b)
    

    有一些正式的数学方法可以在不在内存中维护映射的情况下映射未映射的置换,但它们通常不被使用,因为索引增长非常快,通常会在数量超过MAX_INT时产生问题。

    请记住,这不是最清晰或最简单的字符串置换方法。事实上,就编程风格而言,这是难以形容的糟糕。相反,这是一个教科书上的例子来说明递归的一种形式。理解正在发生的事情最简单的方法就是一步一步地去做

    从构造函数开始。它保存单词,将其索引设置为0,然后(如有必要)从单词的第二个到最后一个字符创建一个新的PermuteString对象。完成此操作后,您将拥有一个PermuteString对象的链接列表:首先是“opyn”,然后是“pyn”,“yn”,