`

字符串的排列(A(m,n))

 
阅读更多

题目:有A,B,C,D,E 5个字母,从其中任选3个,要求列出所有可能的排列

 

我的想法是,先用组合的算法把所有的组合算出来,然后对每个组合进行全排列。

 

代码如下:

import java.util.Scanner;

/*
 * 主要的思想是在组合的基础上进行全排列
 */
public class Pailie {
	private static String str = "ABCDEF";// 字符串
	private static int n = 3;// 选择的个数

	public static void main(String[] args) {
		new Pailie();
	}

	Pailie() {

		Scanner input = new Scanner(System.in);
		System.out
				.println("请输入要从(" + str + ")中选择的个数(要少于" + str.length() + "个)");
		n = Integer.parseInt(input.nextLine());

		zuhe("", 0);

	}
//组合的算法
	public static void zuhe(String s, int i) {
		String temp = s;// 保存上一次的字符串

		if (s.length() == n) {
			//System.out.println(s);
			char c[] = s.toCharArray();
			pailie(0, c);
		} 
			// 先取字符的第一位,然后判断长度是否够题目要求。如果够就得了一个组合。否则继续取下一位加上第一位。再判断。以此类推
		for (int k =i; k < str.length(); k++) {
			s = temp;
			s += str.charAt(k);
			zuhe(s, k+1);
		}
	}
	//排列的算法
	// 先对字符最后俩位进行全排列,也就是交换。然后再对最后三位进行全排列。也就是在前一个全排列的基础上进行交换。以此类推。直到字符串的第一位。
	public static void pailie(int i, char[] c) {
		if (i == c.length - 1) {
			for (char d : c) {
				System.out.print(d + " ");
			}
			System.out.println();
		} else {

			for (int k = i; k < c.length; k++) {
				// 交换
				char temp = c[i];
				c[i] = c[k];
				c[k] = temp;
				// 进行递归
				pailie(i + 1, c);
				// 还原数组
				temp = c[k];
				c[k] = c[i];
				c[i] = temp;

			}

		}

	}

}

 

 
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics