Java实现全排列

鉴于最近在面试,需要复习一下算法什么的,就把之前写的一些算法程序发出来。

public class Test {
	public static char[] text = { 'a', 'c', 'c', 'd' };

	public static void main(String[] args) {
		permutation(text, 0, text.length);
		System.exit(0);
	}

	/**
	 * 全排列输出
	 *
	 * @param a
	 *            [] 要输出的字符数组
	 * @param m
	 *            输出字符数组的起始位置
	 * @param n
	 *            输出字符数组的长度
	 */
	public static void permutation(char a[], int m, int n) {

		if (m < n - 1) {
			permutation(a, m + 1, n); // 从第2个元素开始全排列
										// 以后从第2个元素开始与第一个元素交换,再从第2个元素开始全排列
										// 最后还原序列,进行循环
			char t;
			for (int i = m + 1; i < n; i++) {
				if (a[m] != a[i]) {
					t = a[m]; // 交换
					a[m] = a[i];
					a[i] = t;
					permutation(a, m + 1, n);
					t = a[m]; // 还原
					a[m] = a[i];
					a[i] = t;
				}
			}
		} else {
			printResult(a);
		}
	}

	/**
	 * 输出指定字符数组
	 */
	public static void printResult(char[] text) {
		for (int i = 0; i < text.length; i++) {
			System.out.print(text[i]);
		}
		System.out.println();
	}
}
时间: 2024-09-30 20:06:21

Java实现全排列的相关文章

JAVA求解全排列

一,问题描述 给定一个字符串,求出该字符串的全排列. 比如:"abc"的全排列是:abc.acb.bac.bca.cab.cba 二,实现思路 采用递归的方式求解.每次先选定一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来.至此,一趟全排列完成.第二趟,选定下一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来...... 就类似于:(参考网上的解释如下:) 设R={r1,r2,..

java字典序全排列

import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto","too" *1,从右端开始扫描,若出现前一个比后一个小,记录前一个的元素下表index *2,再找出index以后比该元素大的中的最小值的下标,(实现见 下面的getMin方法) *3,index以后的元素实现反转(实现 见下面的reverse方法) *结束条件:前一个都比后一

HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻的圆中的数值总和为一个质数. 注:第一圈数应该是1. 输出: 输出格式显示为下面的示例.每一行代表在环里圆中的数从1开始顺时针和逆时针.数字的数量必须满足上述要求.按字典顺序打印解决方案. 你是写一个程序,完成上述过程. 每一种情况下打印一条空白线. 题目分析: 首先,因为需要遍历多次,质数不可能每

java 实现全排列

听到同学的说的一个面试题-实现12345的全排列,这道题目的解法和迷宫类似,通过递归回溯实现,下面是小弟的实现方法. public static void main(String[] args){ int [] data={1,2,3,4,5}; boolean[] b=new boolean[data.length]; quanpailie(data, b, 0,""); } //递归实现 public static void quanpailie(int [] data,boole

java 字符串全排列 和 去重

用递归进行排序 , 用TreeSet 去重. public class test { public static void main(String []args){ String str = "AVCV"; TreeSet set = new TreeSet(); List list = digui(str); System.out.println(list.size()); for(Object o :list){ set.add(o.toString()); } } public

出栈顺序 与 卡特兰数(Catalan)的关系

一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3  ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2.2 1 3.2 3 1.3 2 1 二,问题分析 先介绍几个规律: ①对于出栈序列中的每一个数字,在它后面的.比它小的所有数字,一定是按递减顺序排列的. 比如入栈顺序为:1 2 3 4. 出栈顺序:4 3 2 1是合法的,对于数字 4 而言,比它小的后面的数字是:3 2 1,且这个顺序是递减顺序.

全排列算法-Java

第一步,排列的精髓是交换和顺序处理,比如,考虑[1,2,3,4]排列,实际上是,1和1,2,3,4分别交换得来 1和1交换:[1],[2,3,4] 1和2交换:[2],[1,3,4] 1和3交换:[3],[2,1,4] 1和4交换:[4],[2,3,1] 那么下面分别考虑上面的四个结果,比如,考虑 [1],[2,3,4] 第二步,我们把[1]固定不变,考虑[2,3,4],把它看成是2和2,3,4分别交换,得到如下结果: [1]固定,2和2交换:[1],[2],[3,4] [1]固定,2和3交换:

全排列问题(JAVA和Python实现)

问题:给定指定字符串(ABCCEF)输出其全排列.   运用分治的思想 JAVA:用TreeSet去重(且保持有序) import java.util.Set; import java.util.TreeSet; public class Main { static Set<String> result=new TreeSet<String>();//用来去掉重复的元素 public static void fullPermutation(char[] data, int flag

HDOJ-ACM1015(JAVA) 运用 组合、全排列实现

转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5573934.html 这个题目的题意:(自己结合百度翻译,简单的翻译了一下) “这个项目是在一个在二楼图书馆一幅画的背后的克莱因的保险箱里.克莱因的保险柜是极为罕见的:他们中的大多数都随着克莱因和他的工厂在二战中被摧毁.幸运的是,老布伦博在他死之前研究发现了克莱因的秘密并写下来了.一个克莱因保险箱有两个特点是:一个使用字母而不是数字的组合锁,和一个刻在门上的引用.克莱因的引用总是包含五个和十二个不同的大写字母