首页 > 编程知识 正文

全排列问题算法分析,C与A全排列公式

时间:2023-05-04 02:22:55 阅读:174758 作者:4368

今天在打磨剑指报价的编程问题时遇到了全排列问题,现在记录下来。

输入题目如下:字符串,并按字典顺序打印该字符串中字符的所有数组。 例如,输入字符串abc将打印以字符a、b、c排列的所有字符串abc、acb、bac、bca、cab、cba。

首先,这里以数组为例。 序列arr [ 1,2,3,4 ]

134是第一

然后保持1,排列【2 3 4】

然后保持2排列【34】

保持3排在对4

因此,与【1 2 3 4】并列

以下3.4由【12.4】代替

同样可以得到

【1 3 2 4】

【1 3 4 2】

【1 4 2 3】

【1 4 3 2】

这样,以1开始的东西就排完了

然后投2、3、4次对应排列为全排列

这样,问题可以分解如下

T=【 x1,x2,x3,x4,x5, xn1,xn】

我们获得了处于初始位置的所有情况后(注:所有情况),对于每个情况,如果去掉序列t的初始位置,则对于剩下的序列可以看作是全新的序列

T1=【x2,x3,x4,x5,…………XN1,xn】

排列T1被认为与前面的排列无关。 同样,我们可以对这个T1进行与t相同的操作,直到t中只有一个元素。 这样我们就得到了所有的可能性。 所以很明显,这是一种递归算法。

在第1位的所有情况下(只需将x1与后面所有的数x2、x3、…….xn依次更换一次

如图所示:

这样,全数组非递归算法如下。

包全功能; import java.util.Arrays; publicclassfullarr1{ publicstaticvoidfullarr (int [ ] arr,int start,int end ) { if } start==end } { system.out.print } iend; I ) swap(arr,start,I ); Fullarr(Arr,start 1,end ); } } publicstaticvoidswap (int [ ] arr,int start,int end ) { int temp=arr[start]; arr[start]=arr[end]; arr[end]=temp; } publicstaticvoidmain (string [ ] args ) int [ ] arr={ 1,2,3 }; Fullarr(Arr,0,arr.length ); }

这是没有重复要素时的全排列

对于右重复元素:例如【1(2)】

解决方法如下。

publicstaticvoidfullarr (int [ ] arr,int start,int end ) if ) start==end ) system.out.println ) arrays.tos trind } iend; I ) swap(arr,start,I ); Fullarr(Arr,start 1,end ); swap(arr,start,I ); //为了还原以前交换的元素}

此时,还是右重复元素。 这里可以使用集合Set。 Set访问不重复的元素。 这样可以消除重复因素。

代码如下所示。

包全功能; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; /* *全部数组*输入字符串,按词典顺序打印该字符串中字符的全部数组。 *例如,如果输入字符串abc,则会打印以字符a、b、c排列的所有字符串abc、acb、bac、bca、cab、cba。 */publicclassfullarr { publicarrayliststringpermutation (stringstr ) { SetString set=new HashSet; ArrayList string list=new ArrayList (; if(str==null||str.length(==0) { return list; }Fullarr(set,str.toCharArray ) ),0 ); list.addall(set; collections.sort(list; 返回列表; } publicstaticvoidfullarr (setstring set,char[] ch,int start ) if ) start==ch.length ) set.add ) newstring ) chart ich.length; I ) swap(ch,start,I ); Fullarr(set,ch,start 1); SWAP(ch,start,I ); } } publicstaticvoidswap (char [ ] ch,int start,int end ) { char temp=ch[start]; ch[start]=ch[end]; ch[end]=temp; } publicstaticvoidmain (string [ ] args ) { String str='aba '; FullArr fullArr=new FullArr (; liststringlist=fullarr.permutation (str; 字符串:列表(for ) system.out.println )字符串; } }

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