字符串的排列组合(组合需无重复字母)

import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Stack;

//字符串的排列组合
public class Combination {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		String string = scan.next();
		Stack<Character> result = new Stack<Character>();
		System.out.println("字符串的全部组合方法0");
		Allcombine(string, result);
		System.out.println("字符串的全部组合方法1");
		for (int i = 1; i <= string.length(); i++) {
			Allcombineone(string, i, result);// 字符串的全部组合
		}
		System.out.println("字符串的全部组合方法2");
		Allcombinetwo(string);
		System.out.println("字符串的全部排列");
		permutation(string.toCharArray(), 0);

		char[] a = new char[5];
		Arrays.fill(a, 'a');
		System.out.println(a);

	}

	public static void Allcombine(String string, Stack<Character> result) {
		if (string.length() == 0) {
			Iterator<Character> it = result.iterator();
			while (it.hasNext()) {
				System.out.print(it.next());
			}
			System.out.println();
			return;
		}
		// if (string.length() == 0 || string == null) {
		// return;
		// }

		result.push(string.charAt(0));
		Allcombine(string.substring(1, string.length()), result);
		result.pop();
//		System.out.println("字符串长度" + string.length());
		Allcombine(string.substring(1, string.length()), result);

	}

	public static void Allcombineone(String string, int number,
			Stack<Character> result) {
		if (number == 0) {
			Iterator<Character> it = result.iterator();
			while (it.hasNext()) {
				System.out.print(it.next());
			}
			System.out.println();
			return;
		}
		if (string.length() == 0 || string == null) {
			return;
		}

		result.push(string.charAt(0));
		Allcombineone(string.substring(1, string.length()), number - 1, result);
		result.pop();
		Allcombineone(string.substring(1, string.length()), number, result);

	}

	// 将1到N-1用二进制表示,有1的输出该位置的字母,方法非常好,主要用到移位操作
	public static void Allcombinetwo(String str) {
		int N = str.length();
		int num = (int) Math.pow(2.0, N);// Cn0+Cn1+Cn2+......+Cnn=2的n次方
		for (int i = 1; i < num; i++) {
			for (int j = 0; j < N; j++) {
				if (((i >> j) & 1) != 0)
					System.out.print(str.charAt(j));
			}
			System.out.println();
		}
	}

	// 全排列
	public static void permutation(char[] str, int start) {
		if (str == null || str.length == 0) {
			return;
		}
		if (start == str.length) {
			System.out.println(str);
			return;
		}
		for (int i = start; i < str.length; i++) {
			if (isExist(str, start, i)) {//加上这个条件变成有重复字母下的全排列
				char temp1 = str[i];
				str[i] = str[start];
				str[start] = temp1;
				permutation(str, start + 1);
				char temp2 = str[i];
				str[i] = str[start];
				str[start] = temp2;
			}
		}
	}
	//判断str[i]在(start到i-1)的范围内是否出现过
	public static boolean isExist(char[] str , int start , int i){
		for(int j =start;j<i;j++ ){
			if(str[j]==str[i])
				return false;
		}
		return true;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值