首页 > 编程知识 正文

java实现全排列(全排列的java算法_全排列算法(java实现) 组合算法实现)

时间:2023-05-04 22:14:54 阅读:121119 作者:396

100题53题和70题

做100题的时候,全数组的算法困扰了很久。 我在网上找了资料,但是不明白。 今天花了下午的时间重新整理,终于明白了。

所有数组的算法都位于递归分析网上:

设一组数p={r1,r2,r3,rn},所有序列为perm(p ),pn=p - {rn}。

因此,perm(p )=R1perm ),P1 ),R2perm ),R3perm ),rnperm ) pn )。 n=1时,perm(p )=R1。

按如下方式实现Java代码:

publicclasspermutate{

publicstaticinttotal=0;

publicstaticvoidswap (字符串[ ] str,inti,intj ) )。

{

Stringtemp=newString (;

temp=str[i];

str[i]=str[j];

str[j]=temp;

}

publicstaticvoidarrange (字符串[ ] str,intst,intlen ) ) ) ) ) ) ) ) )。

{

if(ST==len-1 ) ) ) )。

{

for(inti=0; I

{

system.out.print(str[I] ';

}

System.out.println (;

总体;

}

else

{

for(inti=ST; I

{

swap(str,st,I );

Arrange(str,st 1,len );

swap(str,st,I );

}

}

}

//*

*@paramargs

*/

publicstaticvoidmain (字符串[ ] args ) {

//todo自动生成方法

Stringstr[]={'a '、' b '、' c'};

arrange(str,0,str.length );

system.out.println (总);

}

}

关键是arrange方法的else的内容。 我的理解是(以str[]={'a '、' b '、' c'}的数组为例)。

用I从str[st]制作一个循环:

对于每个循环,将str[i]和str[i]相互交换。 首先,把' a '和自己调换一下。 此时,递归调用arrange[str,st 1,len]

它求出了str[str.len - 1]的数组,即' b '、' c '的数组;

第二次,' a '和' b '互换,递归调用arrange[str,str 1,len],就是求出了{'a ',' c'}的数组。

第三次,' a '和' c '互换,递归地调用arrange[str,str 1,len],是求出' {'b ',' a}的数组。

接下来,以' b '、' c '的数组为例。

首先构造循环,第一次' b '与自己交换,这时调用arrange[str,st 1,len]就是求出c的数组。 呵呵,这个时候终于到了函数递归调用的出口

: st=len - 1。 输出' b' 'c ';

第二次是类似的,' c ',' b ';

现在,我们已经确定了' b' 'c '的排列。 如果加上前面的a,将输出' a''b''c' 'a''c''b '。

可以输出所有数组,如。

组合问题:

打包JavaBaodian;

importjava.util.Arrays;

importjava.util.LinkedList;

importjava.util.List;

公共类组{

//将一个数组中的数量组合全部制成12个列表121221

//考察循环递归

publicstaticvoidmain (字符串[ ] args ) {

//todo自动生成方法

String[]array={'1'、'2'、'3'};

listall(Arrays.aslist(Array ),'');

}

私有状态语音列表(列表,字符串) {

system.out.println (字符串;

for(inti=0; I

列表temp=new linked list (as list;

//system.out.println((/) temp.tostring );

listall(temp,stringtemp.remove(I ) );

}

}

}

//字符串排列

//主题说明

//输入字符串,按词典顺序打印该字符串内的所有字符排列。 例如,输入字符串abc将打印以字符a、b和c排列的所有字符串abc、acb、bac、bca、cab和cba。

//输入说明:

输入//字符串(可能有重复的字符),字符只包含大小写。

saticarraylistlist=new ArrayList (;

publicarraylistpermutation (字符串str )。

字符串匹配=' [ a-za-z ] ';

if(str==null|! str.Matches(Match ) )

返回列表;

}

排列(list,str.toCharArray ),0,str.length );

返回列表;

}

隐私声明(ArrayList list 2,char[]str,intindex,intlength ) {

//todo自动生成方法

if (索引==length-1 ) {

Stringstemp=' ';

for(inti=0; I

stemp=str[i];

}

list2.添加(stemp );

}else{

for(inti=index; I

if(str[I]==str[index]I!=index

继续;

}

swap(str,I,index );

arrange(list2、str、index 1、length );

swap(str,I,index );

}

}

}

私密性voidswap (char [ ] str,inti,intindex ) {

查理;

c=str[i];

str [ I ]=str [索引];

str[index]=c;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。