// 下午一同事提出一个有趣的问题:一行字母(数字符号也行),中间插入特定字符(字符类型不定,我这里用加号),字母的顺序不能变,如下:
ab => a+b 1种
abc=>a+bc;ab+c;a+b+c 3种
abcd=>a+bcd;ab+cd;a+b+cd;abc+d;a+bc+d;ab+c+d;a+b+c+d 7种
一次类推。
搞了差不多一下午,终于搞出来了;说说我的思路:先将字符串(一行字母)分割成数组,再对数组进行随机组合排列(组合排列中用+连接);形成“可以排列的多少种数组”;对新数组循环,循环中将每个元素的+替换成"" 将替换后的元素与ABCD比较不一样的就删除;代码如下:
public function countnum(){
$chars = 'abcd'; // ab / abc / abcd / abcde 随便设
$str_array = str_split($chars); // 对abcd拆分 0=>a, 1=>b, 2=>c,3=>d
$res = array();
$spe_array = $this->arrangement($str_array);
foreach($spe_array as $v) {
$res = array_merge($res, $this->foo(explode(' ', trim($v))));
}
foreach ($res as $key=>$val){
$vals = str_replace("+","",$val);
if($vals != $chars){ // 主要是这里思路最敏捷,合并后与原来的字符画比较,而不用一步一步的做判断
unset($res[$key]);
}
}
unset($res['0']);
echo '<pre>';
print_r($res);
}
// 下面2个函数是随机排列的最大种类,无需改动***************start*********************
function arrangement($arr = array(), $res = '') {
if(! is_array($arr) ) $arr = str_split($arr);
if(empty($arr)) $array[] = $res;
else
foreach($arr AS $k => $v) {
unset($arr[$k]);
foreach( $this->arrangement($arr, $res . " $v") AS $t) $array[] = $t;
$arr[$k] = $v;
}
return $array;
}
function foo($ar) {
$res = array();
if(count($ar) > 2) {
$t = array_shift($ar);
foreach($this->foo($ar) as $v) {
$res[] = "$t$v";
$res[] = "$t+$v";
}
}else {
$res[] = "$ar[0]$ar[1]";
$res[] = "$ar[0]+$ar[1]";
}
return $res;
}
//***************end*********************
效果:
ab
Array ( [1] => a+b )
abc
Array ( [1] => a+bc [2] => ab+c [3] => a+b+c )
abcd
Array ( [1] => a+bcd [2] => ab+cd [3] => a+b+cd [4] => abc+d [5] => a+bc+d [6] => ab+c+d [7] => a+b+c+d )
abcde
Array ( [1] => a+bcde [2] => ab+cde [3] => a+b+cde [4] => abc+de [5] => a+bc+de [6] => ab+c+de [7] => a+b+c+de [8] => abcd+e [9] => a+bcd+e [10] => ab+cd+e [11] => a+b+cd+e [12] => abc+d+e [13] => a+bc+d+e [14] => ab+c+d+e [15] => a+b+c+d+e )
// 这也许不是最简便的方法,欢迎各位指导高效简洁的方法,在此感谢啦!!
相关推荐
人教三年级数学上册排列组合PPT教案.pptx
排列组合是数学中的一种基本概念,它涉及到如何有序或无序地组织元素的问题。在小学二年级的数学学习中,排列组合的知识点主要体现在解决实际问题中,如使用数字卡片摆成不同的数、衣物的搭配方式等。这些题目旨在...
组合数学之排列组合生成算法,很好的学习组合排列算法的资料
高中数学作为基础教育的重要组成部分,其中的排列组合部分对学生的逻辑思维能力和问题解决能力的培养具有不可忽视的作用。排列组合不仅是概率论与统计学的基础,也是解决实际问题不可或缺的工具。在学习排列组合时,...
数学排列与组合PPT课件 数学排列与组合是数学中两个重要的概念,本课件旨在帮助学生理解和掌握排列与组合的概念、定义、公式和应用。 排列的定义是从n个不同元素中取出m(m≤n)个元素,并按照一定的顺序排成一列...
小学数学三年级下册中的数学广角——简单的排列组合的教学课件。从学生感兴趣的小活动开始,引起学生的学习兴趣,用他们学过的知识一步一步进入本次教学的重点——有规律的不遗漏的列出所有的排列可能。
本文件是关于管理类研究生入学考试(简称考研)数学复习资料的一部分,专注于排列组合与概率论的知识点。在管理类考研数学的范畴中,排列组合与概率部分是考生必须掌握的基础数学知识,它涉及到如何对事件和可能的...
一年级数学排列与组合PPT课件.pptx
北航软件学院研究生必修课组合数学第二章排列组合
高中数学排列组合应用高中数学 高中数学排列组合应用高中数学是一门重要的数学分支,旨在解决有限个不同元素的排列和组合问题。高中数学排列组合应用高中数学的核心概念包括排列、组合、排列数和组合数等。 一、...
高二数学是高中数学学习的重要阶段,而排列组合问题作为高二数学中的经典题型之一,对培养学生的逻辑思维能力和解决实际问题的能力有着举足轻重的作用。掌握解决排列组合问题的方法与技巧,是提高解题效率和准确性的...
排列组合是离散数学中的基本概念,排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,而组合则是指不考虑顺序的选取。在编程中,可以使用递归或动态规划方法实现。本项目中的排列组合生成器,很...
排列组合是常见的数学问题,本文就以完整实例形式讲述了C#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下: 首先,数学中排列组合,可表示为:排列P(N,R) 其实排列实现了,组合也就实现了,组合...
综合这些知识,高中数学排列组合的微专题80,让学生通过这些模型和方法,更好地理解排列组合问题的本质,并在实际问题中灵活运用,提高解决问题的能力。在实际教学中,教师可以利用这些知识点设计更多贴近生活、富有...
本压缩包“数学排列和组合练习题 加详细解释.rar”提供了一系列关于这两个主题的练习题目,旨在帮助学习者深入理解和掌握这两个概念。 排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的方法...
综上所述,本文介绍了一个关于重复组合公式的新的证明方法。通过引入概率论的思想,并结合具体的例子进行分析,我们不仅验证了该公式的正确性,还展示了其在实际问题中的应用价值。这对于深入理解组合数学以及其在...
高中数学排列组合-平均分组(分配问题) 高中数学排列组合是数学的一个重要分支,它广泛应用于计算机科学、信息论、统计学、密码学等领域。平均分组(分配问题)是高中数学排列组合的一个重要应用领域,本节课程旨在...
高中数学排列与组合知识点 排列与组合概念 排列和组合是高中数学中两个重要的概念,它们都是从n个不同元素中取出m(m≤n)个元素,但它们之间有着很大的不同。排列强调元素的顺序,而组合则不考虑元素的顺序。 ...
高等数学 排列 组合 VC++程序