三个字符的排列组合程序如下:

package ww;

import java.math.BigInteger;
import java.util.*;

public class PermutationGenerator {

	private int[] a;
	private BigInteger numLeft;
	private BigInteger total;

	public PermutationGenerator(int n) {
		if (n < 1) {
			throw new IllegalArgumentException("Min 1");
		}
		a = new int[n];
		total = getFactorial(n);
		reset();
	}

	public void reset() {
		for (int i = 0; i < a.length; i++) {
			a[i] = i;
		}
		numLeft = new BigInteger(total.toString());
	}

	public BigInteger getNumLeft() {
		return numLeft;
	}

	public BigInteger getTotal() {
		return total;
	}

	public boolean hasMore() {
		return numLeft.compareTo(BigInteger.ZERO) == 1;
	}

	private static BigInteger getFactorial(int n) {
		BigInteger fact = BigInteger.ONE;
		for (int i = n; i > 1; i--) {
			fact = fact.multiply(new BigInteger(Integer.toString(i)));
		}
		return fact;
	}

	public int[] getNext() {

		if (numLeft.equals(total)) {
			numLeft = numLeft.subtract(BigInteger.ONE);
			return a;
		}

		int temp;

		// Find largest index j with a[j] < a[j+1]

		int j = a.length - 2;
		while (a[j] > a[j + 1]) {
			j--;
		}

		// Find index k such that a[k] is smallest integer
		// greater than a[j] to the right of a[j]

		int k = a.length - 1;
		while (a[j] > a[k]) {
			k--;
		}

		// Interchange a[j] and a[k]

		temp = a[k];
		a[k] = a[j];
		a[j] = temp;

		// Put tail end of permutation after jth position in increasing order

		int r = a.length - 1;
		int s = j + 1;

		while (r > s) {
			temp = a[s];
			a[s] = a[r];
			a[r] = temp;
			r--;
			s++;
		}

		numLeft = numLeft.subtract(BigInteger.ONE);
		return a;

	}

	// 程序测试入口
	public static void main(String[] args) {

		int[] indices;
		String[] elements = { "2", "f", "b" };
		PermutationGenerator x = new PermutationGenerator(elements.length);
		StringBuffer permutation;

		while (x.hasMore()) {
			permutation = new StringBuffer();
			indices = x.getNext();
			for (int i = 0; i < indices.length; i++) {
				permutation.append(elements[indices[i]]);
			}
			System.out.println(permutation.toString());

		}
	}

}

输出的结果是:
2fb
2bf
f2b
fb2
b2f
bf2
评论
发表评论

您还没有登录,请登录后发表评论

qmug
搜索本博客
我的相册
最近加入圈子
存档
最新评论