 
         
         
         
         
        
            全文预览已结束            
        
        下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
            字符串全排列算法C语言实现问题描述:输入一个字符串,打印出该字符串中字符的所有排列。输入:123输出:123132213231312321问题分析:现象分析:这种问题,从直观感觉就是用递归方法来实现即:把复杂问题逐渐简单化,进而得出具体代码实现。(如何发现一个问题可以使用递归方式来解决? 经分析可以发现:M个数的排列方法与N(NM)个数的排列方法没有区别,处理方法与数据的个数没有关系。处理方法的一致性,就可以采用递归)。3个数(123)排列,第一位1不动,剩下两个数(23)的排列,只要相互颠倒一下,就可以出现关于1开头的所有排列 123 132把2换到第一位,保持不动,剩下的两个数(13)的排列,只要相互颠倒一下,就可以出现关于2开头的所有排列 213 231同理,把3换到第一位,可得到 312 321扩展:把3个数的所有排列,前面加一个4,就可以得到关于4开头的所有的排列412341324213423143124321若把4与后续数据中的任意一个数据交换,通过完成对后续三个数的全排列,就可以得到相应的数开头的四数的排列。总结:对4个数的排列,可以转换成首位不动,完成对3个数的排列对3个数的排列,可以转换成首位不动,完成对2个数的排列对2个数的排列,可以转换成首位不动,完成对1个数的排列对于1个数,无排列,直接输出结果算法实现说明:对n个数的排列,分成两步:(1)首位不动,完成对n-1个数的排列,(2)循环将后续其他数换到首位,再次进行n-1个数的排列注:排列完成后,最终的串要与原串相同C语言代码实现: #include #include /将串左移一位,首位存到末尾。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, int head ) int i,len; len=strlen(list) ; if ( len-head = 1 ) /后续没有再排列的,则输出排列数据 printf( %sn, list ); else for (i = k; ilen; i+) /从当前位置开始,每个数当一次队首,并进行后续排列 permutation(list, head+1); /后续串排列shift( &listhead ); /轮流为当第一 void pailie( char *str ) permutation( str, 0 ); /排列算法,从串的第几位开始排列 int main() char str=1234; pailie(str); return 0;带重复数据的排列问题:如果有重复数据出现在待排列的数据中,则,若某数已经当过队首,则与其相同的数再当队首是一样的排列结果,如:1233进行全排列当第一个3当队首时,会出现一次全排列第二个3当队首时,会出现与第一个3当队首相同的全排列,因此,只需要保证此数据出现过队首时,不要让其再当队首就可以解决问题了。代码实现:/检查chk位的数据是否曾经当过队首/*list:待排列的全部数据 chk:待检查的位置 begin:已当过队首的数据的起始位置。因为是移位,所以,从begin检查到list尾就可以了。*/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; ibegin;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; ilen; i+) if ( !is_dup ( list,i,k ) ) /如果没有重复的,则进行相应的排列,否则跳过之,因为:相同的数据当队首,交换没有意义swap(&listk, &listi);/交换permutation(list, k+1); /后续串排列swap(&listi, &listk);/恢复 void p        
    温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年焊工(初级)证模拟考试题库及答案
- 项目预算与成本管控方案
- 2025年国家能源集团招聘秋招笔试题库附带答案详解版
- 2025年国家工作人员学法用法考试题库(含参考答案)
- 2025年国际政治关系与外交政策知识考察试题及答案解析
- 储能电站无人值守运行方案
- 钢结构工程抗震设计技术方案
- 国家能源投资集团有限责任公司2024-2025年度博士后招收笔试历年参考题库附带答案详解
- 2025秋季内蒙古呼和浩特石化分公司高校毕业生招聘100人笔试历年参考题库附带答案详解
- 2025年贵州长征文化旅游(集团)有限公司招聘25人笔试历年参考题库附带答案详解
- 2025春季学期国开电大专科《经济学基础》一平台在线形考(形考任务1至4)试题及答案
- 《社区护理》高等医学院校护理专业全套教学课件
- 全国职业技能竞赛焊工理论试题库
- 塞尔达玩家测试题及答案
- DB42∕T609-2010 湖北省主要造林树种苗木质量分级
- 成人脓毒症患者医学营养治疗要点指南解读(2025年)解读课件
- 黑龙江省新时代高中教育联合体2024-2025学年高一上学期期末联合考试地理试卷(解析版)
- 中药入库验收(中药储存与养护课件)
- 输变电工程监督检查标准化清单-质监站检查
- 【粤教版】五年级上册第一单元 第1课《插接小鱼》课件
- 正规完整版债务重组协议标准版可打印
 
            
评论
0/150
提交评论