`

字符串的组合(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种组合

分享到:
评论

相关推荐

    字符串的组合算法问题的C语言实现攻略

    基本字符串组合问题 题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。 上面我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    世界500强面试题.pdf

    1.4.3. 有 n 个长为 m+1 的字符串 ................................................................ 82 1.4.4. n 支 队伍比赛 ..................................................................................

    2023年第十四届蓝桥杯大赛软件类省赛C&C++研究生组真题(包含代码&完整题解)

    2023年第十四届蓝桥杯大赛软件类省赛C&C++研究生组真题(包含代码&完整题解) C题-翻转 贪心 如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。...J题-反异或 01 串 字符串-回文串

    正则表达式教程

    正则表达式教程  正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 &lt;br&gt;列目录时, dir *....

    入门学习Linux常用必会60个命令实例详解doc/txt

    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...

    java 正则表达式

    应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;} 匹配空行的正则表达式:\n[\s| ]*\r 匹配html标签的正则...

    算法之排列算法与组合算法详解

    本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等。 2. 排列算法 常见的排列算法有: (A)字典序法 (B)递增进位制数法 (C)递减进位制数法 (D)邻位对换法 (E)递归法 介绍常用的两种...

    Java-PHP-C#

    例如"/ac+/"表示被匹配的对象可以是"act"、"account"、"acccc"等在"a"后面出现一个或者多个"c"的字符串。"+"相当于"{1,}"。 星号:"*"字符用来匹配元字符前的字符出现零次或者多次。例如"/ac*/"表示被匹配的对象...

    正则表达式 – 示例

    正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,如 A,不论出现在搜索字符串中的何处,它总是匹配字母 A。下面是一些单字符正则表达式模式的示例: /a/ /7/ /M/ 可以将许多...

    lintcode 425. 电话号码的字母组合

    给一个不包含’0’和’1’的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。 下图的手机按键图,就表示了每个数字可以代表的字母。 1 2 3 abc def 4 5 6 ghi jkl mno 7 8 9 pqrs ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...

    正则表达式

    例如,序列 "\n" 在字符串中匹配的是一个直接量换行符.在正则表达式中,许多标点符号都有特殊的含义.下面是这些字符和它们的含义: 正则表达式的直接量字符 字符 匹配 ________________________________ 字母数字...

    python考试最新试题及答案解析.docx

    要在字符串中添加换行符,可使用字符组合的是: A、\a B、\n C、\q D、\x" 4、Python中,3 ** 2 的结果是: A、3 B、6 C、9 D、12 5、Python中,在列表strs=['a','b','c']中的元素a和b中间添加一个元素m,正确的是:...

    常用算法代码

    | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 ...

    c# 加密和解密相关代码

    在字符串中查找指定字符时,可以先将字符串显示在richTextBox 控件中,然后利用richTextBox 类的Find 方法在该控件中查找指定字符。在字符串中查找指定字符的代码如下: 第19章 加密与解密技术 833 M_int_index = ...

    经典算法(c&java版)

    • 字符串核对 • 双色、三色河内塔 • 背包问题(Knapsack Problem) 数、运算 • 蒙地卡罗法求 PI • Eratosthenes筛选求质数 • 超长整数运算(大数运算) • 长 PI • 最大公因子、最小公倍数、因式...

    二十三种设计模式迷你手册

    你不希望在抽象和它的实现部分之间有一个固定的绑定关系。...一个简单的例子便是C o p l i e n 的S t r i n g 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。

Global site tag (gtag.js) - Google Analytics