C实现字符排列
来源:互联网 发布:淘宝护肤品店铺排行 编辑:程序博客网 时间:2024/06/05 02:16
用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。 例如,对于s[]=”abc”,n=2,则所有字符的排列有:ba,ca,ab,cb,ac,bc。
算法思想:
使用递归完成该实例。
- 举个例子:
- s = “abc”,n=2
- 则第一个perm(n,s),即perm(2,”abc”);
- 首先需要判断w中的字符个数是否满足,n=2>1,表示还没有满足
- 首先,从s的第一个元素开始,s[1] = ‘a’;
- 填充到w中,w[n-1]即,w[1] = ‘a’;
- 紧接着,进行一些调整,使得s1 = bc,n=1
- 进行同样的perm,即perm(1,”bc”);同样先进行判断
- 选择b填充到w中,在进入perm(0,”c”),判断输出
- 接着,回到上一层,perm(1,”bc”),再选择字符”c”进入w
- 选择c进入w之后,进行一些调整,将s1调整成这样一个字符串s1=”cb”,
- 这样进入perm(0,”b”),判断输出.
* - 接着,进入第一层,由于ba,ca都已经输出完毕,第一个元素从b开始进行选择
- 首先将b放入w中,即w[1] = ‘b’;接着进行一些调整,将s1调整为s1 = “bac”;
- 进入perm(1,”ac”);
- 以此方式进行递归,完成。
下面是代码实现部分:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 20char w[N];void perm(int n,char *s);/** * 用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。 * 设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。 * 例如,对于s[]="abc",n=2,则所有字符的排列有:ba,ca,ab,cb,ac,bc。 */int main(){ char s[N]; int n; printf("Please enter the char array:\n"); scanf("%s",&s); printf("Please number:\n"); scanf("%d",&n); perm(n,s); //调用排列函数 return 0;}/** * 举个例子: * s = "abc",n=2 * 则第一个perm(n,s),即perm(2,"abc"); * 首先需要判断w中的字符个数是否满足,n=2>1,表示还没有满足 * 首先,从s的第一个元素开始,s[1] = 'a'; * 填充到w中,w[n-1]即,w[1] = 'a'; * 紧接着,进行一些调整,使得s1 = bc,n=1 * 进行同样的perm,即perm(1,"bc");同样先进行判断 * 选择b填充到w中,在进入perm(0,"c"),判断输出 * 接着,回到上一层,perm(1,"bc"),再选择字符"c"进入w * 选择c进入w之后,进行一些调整,将s1调整成这样一个字符串s1="cb", * 这样进入perm(0,"b"),判断输出. * * 接着,进入第一层,由于ba,ca都已经输出完毕,第一个元素从b开始进行选择 * 首先将b放入w中,即w[1] = 'b';接着进行一些调整,将s1调整为s1 = "bac"; * 进入perm(1,"ac"); * 以此方式进行递归,完成。 */void perm(int n,char *s){ if(n < 1){ //如果n小于1,表示w中的长度已经达到需要的长度 printf("%s\n",w); return; }else{ char s1[N]; //临时变量存储 strcpy(s1,s); int i; for(i = 0;*(s1+i);i++){ //从s1中选择一个字符放入w对应的位置中 *(w+n-1) = *(s1+i); //将从s1中被选择的字符替换成第一个字符 *(s1+i) = *s1; //将第一个字符换成被选择的字符 *s1 = *(w+n-1); perm(n-1,s1+1); } }}
下面是程序的运行结果:
总体来说,这个算法的思路还是比较简单的。
1 0
- C实现字符排列
- C语言实现全排列(部分算法参考网友,可实现重复字符的组合)
- C语言实现 函数reverse_string(char * string) 将参数字符串中的字符反向排列。
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。
- 字符全排列的另一种实现
- 字符全排列java实现(转)
- 递归实现的字符全排列
- Java实现字符数组全排列
- js实现字符全排列算法
- PHP实现字符的全排列
- 全排列C语言实现
- C语言实现全排列
- C语言实现全排列
- C语言实现全排列
- 【c语言】编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。
- C语言 编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列
- 字符排列
- 递归实现将参数字符串中的字符反向排列,要求不能使用C函数库中的字符串操作函数
- Javascript:谈谈JS的全局变量跟局部变量(转zyz511919766)
- 数据结构系列之循环队列
- 6.10 文件转移
- 认识自己——做人要大气魄力,要经得住挑战
- 第13周-阅读项目3-对文本文件的访问
- C实现字符排列
- Table动态增加删除行
- C++打开指定文件夹,并选中文件
- Climbing Stairs
- 6.5 UITabBarController
- OpenWrt系统安全改进<四> --- Web UI权限分级
- 第14周程序阅读 例6.3
- (转)位计算的诸多算法(计算二进制1的个数)
- 黑马程序员---IOS---结构体概念及用法