字符串的组合(C(m,n))

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

 

大家一定还记得高中的时候学过的组合C(m,n)算法吧。。那么我们就用这个算法来做这道题吧。

 

其实做出这道题有俩种方法,一种是递归的。比较容易一点。另外一种是非递归的。

 

递归的代码如下:

 

/*
 * 主要是利用递归来来实现。主要思想是把一个字符串分为俩段来处理,首先取出第一个字符串,然后用后面的字符来与它进行拼凑。
 */
import java.util.Scanner;

public class Zuhe {
	private static String str = "ABCDE";// 字符串
	private static int n = 3;// 选择的个数
	private static int count = 0;//组合的个数

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

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

		find("", 0);
		System.out.println("共有"+count+"种组合");

	}
/*
 *第一个参数是代表第一个字符,第二个参数代表开始寻找点的位置
 */
	public static void find(String s, int i) {
		// 保存上一次的字符串
		String temp = s;
		//判断是否符合要求
		if (s.length() == n) {
			count++;

			System.out.print(s + " ");
			if (count % 10 == 0)
				System.out.println();
			return;
		}
		//从寻找点开始循环,
		for (int k =i; k < str.length(); k++) {
			s = temp;
			s += str.charAt(k);
			find(s, k+1);
		}

	}

}

 

 非递归的代码如下:

/*
 * 采用了图的广度优先算法。也可以说利用队列来实现。先进先出。首先取出第一个字母。然后入队、。
 * 开始循环,出队。循环的结束条件的只要队列还有元素就就循环没有结束。进入循环之后,先判断元素是否符合
 * 要求,如果符合就输出。如果不符合,就给它追加一个字母,开始点是由它的最后一个字符来决定。
 * 比如说:是A就从0开始,是B就从1开始。(这里是难点。)一直找到字符串的末尾。找完之后就
 * 去除取出来的这个元素。以此类推。。。
 */
import java.util.ArrayList;
import java.util.Scanner;

public class Zuhe {
	public static void main(String[] args) {
		String str = "ABCDE";// 字符串
		int n = 2;// 选择的个数
		int count = 0;// 组合的总数
		Scanner input = new Scanner(System.in);
		System.out.println("请输入要选择的个数(要少于" + str.length() + "个)");
		n = Integer.parseInt(input.nextLine());
		ArrayList<String> arr = new ArrayList<String>();//模拟队列
		for (int k = 0; k < str.length(); k++) {
			//取出首节点
			String s = str.charAt(k) + "";
			//入队
			arr.add(s);
			//开始循环
			while (arr.size() > 0) {
				//出队
				String ss = arr.get(0);
				//判断是否符合要求
				if (ss.length() == n) {
					System.out.print(ss + "  ");
					count++;
					if (count % 10 == 0)
						System.out.println();
				}
				//追加字符。
				for (int i = str.indexOf(ss.charAt(ss.length() - 1))+1; i < str.length(); i++) { 					if (ss.length() < n) {
						String m = ss + str.charAt(i);
						arr.add(m);
					}				
				}
				//去除取出来的节点。
				arr.remove(0);
			}
		}
		System.out.println("共有" + count + "种组合");
	}

}

 结果的输出效果:

请输入要选择的个数(要少于5个)
3
ABC ABD ABE ACD ACE ADE BCD BCE BDE CDE
共有10种组合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值