java全排列函数,java实现排列组合算法
00-1010算法一算法二算法三
00-1010是基于递归和回溯实现的。排列1,2,3的时候,先从3回退到2,发现没有其他可能的情况,再回到1,排列成1,3,2,然后再向上回到其他情况,也就是根节点然后以2为第一位排列。重复上述过程,将所有可能的结果放入res。
代码:
导入Java . util . ArrayList;导入Java . util . list;public class h618 _ 1 { static ListListInteger RES=new ArrayList();public static void main(String[]args){ int[]arr={ 1,2,3 };h618 _ 1 h1=new h618 _ 1();h1.dfs(arr,new ArrayList());for(list integer re : RES){ system . out . println(re);} } public ListListInteger DFS(int[]arr,list integer list){ list integer temp=new ArrayList(list);if(arr . length==list . size()){ RES . add(temp);} for(int I=0;iarr .长度;I){ if(temp . contains(arr[I]){ continue;} temp . add(arr[I]);dfs(arr,temp);temp . remove(temp . size()-1);} return res} }
00-1010通过交换位置实现满排列:假设集合为{1,2,3,4 };
循环交换位置:1和1交换;1和2交换;1和3交换;1和4交换;
每个交换递归调用一个较小的集合:
比如1和1的第一次交换决定了1先来,所以可以看作是{1}递归交换{2,3,4 };
1和2的第一次交换决定了2先来,所以可以看作是{2}递归交换{1,3,4 };
1和3的第一次交换决定了3先来,所以可以看作是{3}递归交换{1,2,4 };
1和4的第一次交换确认了4先来,所以可以看作是{4}递归交换{1,2,3 };
诸如此类。
代码:
导入Java . util . ArrayList;导入Java . util . arrays;导入Java . util . list;public class h618 _ 2 { static ListListInteger RES=new ArrayList();public static void main(String[]args){ int[]arr={ 1,2,3 };h618 _ 2 H2=new h618 _ 2();h2.pailie_swap(0,arr);} public void pailie _ swap(int index,int[]arr){ if(arr . length==index){ system . out . println(arrays . tostring(arr));返回;} for(int I=index;iarr .长度;i ){ swap(i,index,arr);pailie_swap(索引1,arr);swap(i,index,arr);} } public void swap(int i,int j,int[]arr){ int temp=arr[j];arr[j]=arr[I];arr[I]=temp;}}
00-1010通过添加元素可以实现完全排列:
首先定义一个列表,并把第一个元素作为;然后将剩余的元素依次插入先前集合元素的所有可能位置,生成新的列表;
比如{1,2,3,4}可以全排。
首先定义一个列表,并将第一个元素添加为{ 1 };然后,可以将第二个元素2插入到{1}的前后两个位置,形成新的列表:{21,12},将第三个元素3插入到列表中元素的所有位置:{321,231,213,312,132,123 };诸如此类。
代码:
导入Java。util。ArrayListpublic class h618 _ 3 { public static void main(String[]args){ String aa= 123 ;h618 _ 3 H3=新h618 _ 3();ArrayList string RES=new ArrayList();RES=H3。get permutation 0(aa);for(String re : RES){ system。出去。println(re);} } public ArrayList String get permutation 0(String A){ int n=A . length();ArrayList string RES=new ArrayList();RES . add(a . charat(0) );//初始化,包含第一个字符for(int I=1;I n;i ) {//第二个字符插入到前面生成集合的每个元素里面ArrayList字符串RES _ new=new ArrayList();char c=a . charat(I);//新字符对于(字符串:分辨率){//访问上一趟集合中的每个字符串//插入到每个位置,形成一个新串String newStr=c str//加在前面RES _ new。add(newStr);newStr=str c;//加在后面RES _ new。add(newStr);//加在中间for(int j=1;j海峡。长度();j ) { newStr=str.substring(0,j)c str。子串(j);RES _ new。add(newStr);} } res=res _ new//更新}返回结果}}到此这篇关于爪哇实现全排列的三种算法详解的文章就介绍到这了,更多相关爪哇全排列内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。