下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、字符串全排列算法C语言实现问题描述:输入一个字符串,打印出该字符串中字符的所有排列。输入:123输出:123132213231312321问题分析:现象分析:这种问题,从直观感觉就是用递归方法来实现即:把复杂问题逐渐简单化,进而得出具体代码实现。(如何发现一个问题可以使用递归方式来解决? 经分析可以发现:M个数的排列方法与N(N>M)个数的排列方法没有区别,处理方法与数据的个数没有关系。处理方法的一致性,就可以采用递归)。3个数(123)排列,第一位1不动,剩下两个数(23)的排列,只要相互颠倒一下,就可以出现关于1开头的所有排列 123 132把2换到第一位,保持不动,剩下的两个数(1
2、3)的排列,只要相互颠倒一下,就可以出现关于2开头的所有排列 213 231同理,把3换到第一位,可得到 312 321扩展:把3个数的所有排列,前面加一个4,就可以得到关于4开头的所有的排列412341324213423143124321若把4与后续数据中的任意一个数据交换,通过完成对后续三个数的全排列,就可以得到相应的数开头的四数的排列。总结:对4个数的排列,可以转换成首位不动,完成对3个数的排列对3个数的排列,可以转换成首位不动,完成对2个数的排列对2个数的排列,可以转换成首位不动,完成对1个数的排列对于1个数,无排列,直接输出结果算法实现说明:对n个数的排列,分成两步:(1)首位不动,
3、完成对n-1个数的排列,(2)循环将后续其他数换到首位,再次进行n-1个数的排列注:排列完成后,最终的串要与原串相同C语言代码实现: #include <stdio.h>#include <string.h>/将串左移一位,首位存到末尾。void shift( char *s )if ( !s|!s0 ) return ; /security code . null stringchar ch=s0;int i=0;while( s+i )si-1=si ;si-1=ch;/本函数对于一个已排序好的数据进行全排列void permutation(char list, i
4、nt head ) int i,len; len=strlen(list) ; if ( len-head = 1 ) /后续没有再排列的,则输出排列数据 printf( "%sn", list ); else for (i = k; i<len; i+) /从当前位置开始,每个数当一次队首,并进行后续排列 permutation(list, head+1); /后续串排列shift( &listhead ); /轮流为当第一 void pailie( char *str ) permutation( str, 0 ); /排列算法,从串的第几位开始排列 in
5、t main() char str="1234" pailie(str); return 0;带重复数据的排列问题:如果有重复数据出现在待排列的数据中,则,若某数已经当过队首,则与其相同的数再当队首是一样的排列结果,如:1233进行全排列当第一个3当队首时,会出现一次全排列第二个3当队首时,会出现与第一个3当队首相同的全排列,因此,只需要保证此数据出现过队首时,不要让其再当队首就可以解决问题了。代码实现:/检查chk位的数据是否曾经当过队首/*list:待排列的全部数据 chk:待检查的位置 begin:已当过队首的数据的起始位置。因为是移位,所以,从begin检查到lis
6、t尾就可以了。*/is_dup( char *list, int begin, int chk )int i;for( i=begin; listi; i+ )if ( listchk = listi )return 1;return 0;void permutation(char list, int k) int i,len; len=strlen(list) ; if ( len-k = 1 ) /后续没有再排列的,则输出排列数据 printf( "%sn", list ); else for (i = k; i<len; i+) if ( !is_dup(lis
7、t, len-(i-k), k ) ) /如果没有当过队首,则排列之permutation(list, k+1); shift( &listk ); 采用数据交换方式实现的全排列,带去重的代码: /交换两个数的位置void swap(char *a, char *b) char m; m = *a; *a = *b; *b = m;/检查某数据是否曾经当过队首(在已交换过的数据中进行查找)/* list:待排列的全部数据end:当前交换的位置 begin:待交换的位置*/int is_dup( char *s, int end, int begin )int i=0;for( i=en
8、d;i>begin;i- )if ( send = si-1 )return 1;return 0;void permutation(char list, int k) int i,len; len=strlen(list) ; if ( len-k = 1 ) /后续没有再排列的,则输出排列数据 printf( "%sn", list ); else for (i = k; i<len; i+) if ( !is_dup ( list,i,k ) ) /如果没有重复的,则进行相应的排列,否则跳过之,因为:相同的数据当队首,交换没有意义swap(&listk, &listi);/交换permutation(list, k+1); /后续串排列swap(&listi, &listk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路施工验收标准规范
- 2025-2030年大田种子企业ESG实践与创新战略分析研究报告
- 2025-2030年智能温控桑拿房控制系统行业跨境出海战略分析研究报告
- 跨设备通讯历史同步服务行业深度调研及发展战略咨询报告
- 休闲度假旅游咨询服务行业跨境出海战略分析报告
- 苏教版小学语文二年级上册全册教案
- 网站安全管理制度规范
- 苏教版三年级数学知识要点归纳
- 《曹刿论战》理解性默写过关训练
- 岗位说明书模版
- 初中教师节升旗仪式演讲稿(16篇)
- 进击的巨人讲解
- 2025年高考语文真题全国一卷4篇高分范文
- 特殊人群服务管理课件
- 神经内科头痛诊疗规范
- 瓷砖防滑培训课件教案
- 2025至2030中国肌萎缩侧索硬化症(ALS)治疗行业项目调研及市场前景预测评估报告
- 中医诊所儿科管理制度
- 工行预售资金管理制度
- GB/T 22107-2025气动方向控制阀切换时间的测量
- 新22J01 工程做法图集
评论
0/150
提交评论