今天在打磨剑指报价的编程问题时遇到了全排列问题,现在记录下来。
输入题目如下:字符串,并按字典顺序打印该字符串中字符的所有数组。 例如,输入字符串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 )字符串; } }