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”,