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;
}