备考蓝桥杯(37)超级无敌经典的全排列算法 java实现
2018-04-02 17:37
525 查看
package pers.robert.lanqiaobeizhenti129; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 46.递归算法 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 * @author Robert * */ public class The046AllSortDemo1 { // 输出 public static void print(List target){ for(Object o: target){ System.out.print(o); } System.out.println(); } // 递归排列 public static void sort(List datas,List target,int n){ if(target.size()==n){ print(target); return; } for(int i=0;i<datas.size();i++){ List newDatas = new ArrayList(datas); List newTarget = new ArrayList(target); newTarget.add(newDatas.get(i)); newDatas.remove(i); //递归 sort(newDatas,newTarget,n); } } // 主函数 public static void main(String[] args){ String[] s = {"a","b","c"}; //System.out.println(Arrays.asList(s)+"+++++"); sort(Arrays.asList(s),new ArrayList(),s.length); } }方法二:package pers.robert.lanqiaobeizhenti129;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 46.递归算法
递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列
* @author Robert
*
*/
public class The046AllSortDemo2_question {
public static void perm(String[] buf,int start,int end){
if(start==end){//当只要求对数组中一个字母进行全排列时,只要按该数组输出即可
for(int i=0;i<=end;i++){
System.out.print(buf[i]);
}
System.out.println();
}
else{//多个字母全排列
for(int i=start;i<=end;i++){
String temp=buf[start];//交换数组第一个元素与后续的元素
buf[start]=buf[i];
buf[i]=temp;
perm(buf,start+1,end);//后续元素递归全排列
temp=buf[start];//将交换后的数组还原
buf[start]=buf[i];
buf[i]=temp;
}
}
}
public static void main(String[] args) {
String buf[]={"a","b","c"};
perm(buf,0,buf.length-1);
}
}
案例二:package pers.robert.lanqiaobeizhenti129;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
47.字符串全排列
字符串全排列
* @author Robert
*
*/
public class The047RecursiveAlgorithmDemo1 {
// 输出字符数组
public static void print(char[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
System.out.println();
}
// 递归遍历
public static void perm(char[] arr,int start,int end){
if(start==end){
print(arr); // 输出
}else{
for(int i=start;i<=end;i++){
// 换位
char c = arr[start];
arr[start] = arr[i];
arr[i] = c;
// 递归
perm(arr,start+1,end);
// 恢复数组原位
c = arr[start];
arr[start] = arr[i];
arr[i] = c;
}
}
}
// 字符串转字符数组
public static void f(String s){
char[] arr = s.toCharArray();
perm(arr,0,arr.length-1);
}
public static void main(String[] args){
String s = "abc";
f(s);
}
}
相关文章推荐
- 蓝桥杯备考(15)NQueen(经典回溯) java实现
- 备考蓝桥杯(5)扑克排列 java实现
- 笔试面试算法经典--全排列算法-递归&字典序实现(Java)
- 【LeetCode-面试算法经典-Java实现】【046-Permutations(求排列)】
- 蓝桥杯:基础练习 杨辉三角形【JAVA算法实现】
- 经典算法问题的java实现<一>
- 【LeetCode-面试算法经典-Java实现】【所有题目目录索引】
- 针对较大基数的排列组合算法Java实现类(n选m)
- 排列和组合算法 C语言经典实现
- 【LeetCode-面试算法经典-Java实现】【004-Median of Two Sorted Arrays(两个排序数组的中位数)】
- 【LeetCode-面试算法经典-Java实现】【008-String to Integer (atoi) (字符串转成整数)】
- Java经典算法的实现(一)-----希尔排序
- 【LeetCode-面试算法经典-Java实现】【009-Palindrome Number(回文数)】
- 【LeetCode-面试算法经典-Java实现】【005-Longest Palindromic Substring(最长回文子串)】
- 【LeetCode-面试算法经典-Java实现】【001-Two Sum(求两个数的和)】
- 算法java实现--回溯法--圆排列问题--排列树
- java排列组合算法代码实现
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- 经典算法:生产者与消费者(JAVA实现)
- 【LeetCode-面试算法经典-Java实现】【003-Longest Substring Without Repeating Characters(最长非重复子字符串)】