这里主要介绍字符串排列组合问题,高中数学常见的题目,不用详细介绍,看例子就可以解决问题

"1212"

全排列结果为 1212,1221,1122,2112,2121,2211

组合结果是   1,2,12

我所理解的排列组合结果是  1,2,12,21

解决方案:主要是利用递归思想

排列问题:求n个字符排列问题简化求n-1个字符排列问题,逐层递归到1个字符。有n个字符的序列第一个字符与后面每一个前面没有重复的字符交换,避免了重复序列,然后求n-1个字符全排列   f(char *s, int index,int len)index为第一个下标,len是s总长度

组合问题:先按照递增排序,然后挑出无重复的元素存于另一个字符串,依次从字符串挑选1..n个字符,递归选择字符串  combine(char *s, char *re,int len, int num)

全排列代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define swap(a,b,c) (c)=(a),(a)=(b),(b)=(c)void permutation(char s[], int b, int len)// 长度为len的字符串,从s[i]开始全排列
{char  c;if(b==len)//等价于 if(s[b]=='\0') printf("%s\n",s);if(b<len) for(int i=b; i<len; i++){int f=0;for(int j=i-1;j>=b; j--)//遍历查询前面有没有出现该字符 if(s[j]==s[i]) {f=1;break;} if( f==1 ) continue;//跳过 swap (*(s+b),*(s+i),c );//交换 permutation(s,b+1,len); //从s[b+1]开始全排列            swap(*(s+b),*(s+i),c); //返回原来字符串顺序 }return;
}
int main()
{char s[]="1212";int len=strlen(s);permutation(s,0,len);system("pause");return 0;
}

  组合代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iostream>
using namespace std;
#define swap(a,b,c) (c)=(a),(a)=(b),(b)=(c)void combine(char *s, char *re,int len, int num)
//len长度的字符串s 选取num个字符自由组合存放到字符串re
{if(num==0)//判断是否完成任务,不再需要选取字符 {printf("%s\n",re);return;}if(len>=num){ combine(s,re,len-1,num);//不选取s[len-1] re[num-1]=s[len-1];    //选取s[len-1]    combine(s,re,len-1,num-1); } return;
}
int cmp (const void *a, const void *b)
{return *(char *)a-*(char *)b;}
int main()
{int len,i,j,k;char s[100],d[100],re[100];while(scanf("%s",s)!=EOF){len=strlen(s);qsort(s,len,sizeof(char),cmp);//s字符串递增排序 d[0]=s[0];for(i=1,j=1; i<len; i++)//挑选出s中独一无二的字符 存到d if(s[i]!=s[i-1])d[j++]=s[i]; d[j]='\0'; for(i=1;i<=j;i++){       re[i]='\0',combine(d,re,j,i);}}}

  

转载于:https://www.cnblogs.com/GarySE/p/3263514.html

排列、组合问题(递归)相关推荐

  1. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值

    null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...

  2. 字符串所有排列组合暴力递归

    给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很 ...

  3. 《算法笔记》—— 解决 排列组合问题 递归的灵活运用

    深知自己的算法特别菜,所以想在算法这方面多下工夫 现在被各种专业课支配着,但每天都会抽出一点时间来学习算法 (^ - ^) 相信大家都了解 * 汉诺塔 * 这个问题,我当时学的是云里雾里的(泪目)-- ...

  4. 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)

    仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...

  5. python实现不重复排列组合_Python实现输入字符串,返回其任意排列组合

    在脉脉上看到的一道算法题,要求如下图: 以下是用Python实现这一算法: def str_rank_combination(s=""): """输入 ...

  6. 前端电商 SKU 的全排列算法很难吗?学会这个套路,彻底掌握排列组合。

    前言 前段时间在掘金看到一个热帖 <今天又懒得加班了,能写出这两个算法吗?带你去电商公司写商品中心>,里面提到了一个比较有意思故事,大意就是一个看似比较简单的电商 sku 的全排列组合算法 ...

  7. 递归法:财务金额漏掉1笔或者几笔(排列组合)

    问题:某财务部门结账时发现金额不对,很可能是从明细上漏掉了一笔或者几笔,如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或者几笔吗? 如果有多种可能,则输出所有可能的情况 我们规定,用户输入的第一行 ...

  8. 走方格跳格子(dp,递归,排列组合三种方法)

    走方格: 给定一个 n×mn×m 的方格阵,沿着方格的边线走,从左上角 (0,0)(0,0) 开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m)(n,m) 一共有多少种不同的走法. 输 ...

  9. 组合排序题目汇总(排列组合、卡特兰数和递归思想)

    组合排序题目汇总 排列组合 矩阵走法 A必须在B左边站队 互不相邻站队 分糖果 球放入桶 吃糖 卡特兰数 括号匹配 进出栈顺序/售票顺序 二叉树不同的结构数 高矮排列 递归思想 信封装信 排列组合 矩 ...

  10. java数组排列组合_java算法题--递归求数组中数字排列组合问题

    java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...

最新文章

  1. 斯坦福前校长John Hennessy、张亚勤等一众大佬云集,共探最前沿技术 | CNCC2020
  2. IDEA注释模板,动作要快,姿势要帅!
  3. Java的中BIO、NIO、AIO-1
  4. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. python 常见函数_Python基础函数:初学者常用的十个Python函数,非常全面!
  6. 区块链BaaS云服务(14)华大BGI区块链“安全多方计算“
  7. Java并发编程—ThreadLocal底层原理
  8. 一步步开始集中管理[为企业部署Windows Server 2008系列五] 推荐
  9. GIMP中的新建Layer与更改Layer大小
  10. 容器编排技术 -- Pod 安全策略
  11. 查看进程中占cpu高的线程方法
  12. 腾讯广告算法大赛“视”界杯专题直播来袭,腾讯专家助你赛场争先!
  13. SVN版控系统的安装和使用
  14. 在线CSV转HTMLTable工具
  15. 一分钟掌握Python字典的用法
  16. 推荐7 款实用好用的电脑软件
  17. Java常见异常和解决办法
  18. 谷歌街景地图推出“时光机”功能
  19. html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
  20. 麻省理工公开课人工智能笔记五

热门文章

  1. Objective-C学习中对 C语言的扩展
  2. C语言:一种通用的程序设计语言
  3. C 流插入和流提取运算符的重载
  4. ajax实现表单验证 html,Ajax+ajax做的表单验证
  5. centos7.4编译mysql5.6,centos7编译安装mysql5.6
  6. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
  7. jq监听子元素被点击_vue开发app点击字母展示地区列表(兄弟组件之间联动)
  8. 2020年9月14日运行代码总结
  9. 光纤收发器通常具有哪些特点?
  10. [渝粤教育] 西南科技大学 经济数学2 在线考试复习资料