`

字符串的组合(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语言实现攻略

    总结来说,字符串组合问题可以通过递归和位运算两种方式在C语言中实现。递归方法直观且易于理解,但可能涉及到大量的函数调用,而位运算方法虽然需要对二进制有一定的理解,但效率更高且占用更少的内存。在实际应用...

    字符串面试题整理

    9. **字符串转化数字以及数字转化字符串**:在C/C++中,可以使用`atoi()`将字符串转换为整数,`atof()`转换为浮点数,而`itoa()`和`sprintf()`可以将数字转换为字符串。在其他语言如Python中,有内置的`int()`和`str...

    字符串的全排列和组合算法.doc

    字符串的全排列和组合算法是计算机科学中的一种基础算法,主要应用于数据处理和问题求解。在本文档中,我们将探讨如何使用C++实现字符串的全排列算法,并讨论如何处理包含重复字符的情况。 首先,全排列是指从一个...

    正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式 它广泛应用于文本处理、数

    正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它广泛应用于文本处理、数据验证、搜索与替换等领域。 正则表达式的基本组成: 普通字符:直接匹配的字符,如 a, b, 1, # 等。...

    js随机生成字母数字组合的字符串 随机动画数字.docx

    js 随机生成字母数字组合的字符串随机动画数字 js 随机生成字母数字组合的字符串是指使用 JavaScript 语言生成一个随机的字母数字组合的字符串,用于各种需要随机字符串的地方。该字符串可以是包含数字、字母或符号...

    正则表达式对字符串的完美验证

    正则表达式(Regular Expression),简称为regex,是一种强大的文本处理工具,常用于字符串的匹配、查找、替换等操作。它通过一种模式来定义字符串的规则,从而实现对特定格式的字符串进行验证和处理。在编程中,...

    易语言源码排列组合模块(M选N)源码.rar

    2. 组合(Combination):当m个元素的顺序不重要时,组合的总数为C(n, m) = n! / [m!(n-m)!]。 易语言提供的这个排列组合模块,很可能是通过递归或动态规划方法实现的。递归算法通常基于基础情况(即m=1或n=m的情况...

    取出汉字字符串的拼音首字母

    private final static String[] lc_FirstLetter = {"a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "w", "x", "y", "z"}; // 获取整个字符串中所有汉字的拼音...

    正则表达式.doc 验证字符串

    正则表达式是一种强大的文本处理工具,用于验证字符串、查找特定模式和替换字符串。它通过一套规则和特殊字符来描述字符串的模式,从而实现高效、灵活的文本操作。 首先,正则表达式的基本功能包括: 1. 验证字符...

    C语言常用转义字符表[参考].pdf

    C语言中的转义字符是指在字符常量或字符串中使用的一些特殊字符,以表达一些不可见或不可打印的字符。这些字符在ASC II码表中有着特定的含义,以下是常用的转义字符: * \o 空字符 (NULL) :00H/0 * \n 换行符 (LF)...

    c#格式化字符串.pdf

    例如,在给定的示例中,`String.Format("item {0} sells at {1:C}", x, y)`将整数`x`和货币值`y`插入到字符串中,其中`{0}`代表第一个参数`x`,`{1:C}`代表第二个参数`y`并将其格式化为货币样式。 `{N}`中的`N`是一...

    C#字符串格式化说明.pdf

    格式字符串的基本结构是`"{N[,M][:formatString]}"`,其中: - `N`是参数的索引,从0开始。 - `M`(可选)是宽度指定器,决定输出的最小宽度,正数表示右对齐,负数表示左对齐。 - `formatString`(可选)是具体的...

    数据结构课件:第3章 数组和字符串.ppt

    对于可变长度的字符串,如C语言中的字符串,其长度不是固定的,而是由最后一个非空字符后的空字符来标识。 数组和字符串的特性使得它们在很多算法中不可或缺,如排序、搜索、动态规划等。理解和掌握这些基础知识是...

    python字符串的相关知识点

    - `split()` 方法按指定分隔符分割字符串成列表,`split('b')` 将字符串 'abcbdbf' 分割为 ['a', 'c', 'd', 'f']。 - `count(sub)` 统计子字符串出现次数,`replace(old, new)` 替换子字符串,`center(width[, ...

    字符串问题蓝桥杯(自用复习)

    ### 字符串问题蓝桥杯知识点详解 #### 一、字符统计问题 ##### 1. 问题描述 在本问题中,我们需要处理一个输入的字符串,并统计其中各个大写字母出现的频率。最终目的是找到出现次数最多的字母。由于只考虑大写...

    解析字符串

    通过组合这些元素,我们可以构建出能够匹配各种复杂字符串模式的表达式。 在"解析字符串"的过程中,我们通常会用到以下几种正则表达式概念: 1. **匹配模式**:如`\w+`匹配任何单词字符(等同于[a-zA-Z0-9_]),`\...

    正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串 在表单验证、Url映射等处都会经常用到

    正则表达式(Regular Expression)是一种强大的文本处理工具,它由一些特殊字符组成,用于匹配、查找、替换符合特定模式的字符串。在信息技术领域,正则表达式被广泛应用在数据验证,如表单验证,URL解析,日志分析...

    c语言作业113道

    这些题目涵盖了C语言的基础知识点,包括输入输出、函数声明与定义、条件判断、循环控制、数组、字符串处理、算术运算以及逻辑运算等。以下是针对每个题目涉及的主要知识点的详细解释: 1. 求最大公约数(Greatest ...

    大学生C语言程序设计(第四版 谭洪强)实验 6答案.pdf

    - 需要遍历字符串数组,同时考虑字符串长度限制`N`和字符串数量`M`。 以上五个题目均体现了C语言基础编程技能和问题解决能力,包括基本的数据类型、控制结构、字符串处理、数组操作和简单的算法设计。通过这些实验...

Global site tag (gtag.js) - Google Analytics