最长公共子序列问题(共21页).doc
《最长公共子序列问题(共21页).doc》由会员分享,可在线阅读,更多相关《最长公共子序列问题(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上目 录1 前言若给定序列X=x1,x2,xm,则另一序列Z=z1,z2,zk,是X的子序列是指存在一个严格递增下标序列i1,i2,ik使得对于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相应的递增下标序列为2,3,5,7。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。请使用C语言编程,设计一个有效的算法解决下述问题:给定2个序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最长公共子序列。2 需求分析2.1 任务和要求使用C语言编程,设计一个有效
2、的算法解决下述问题:给定2个序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最长公共子序列。2.2 运行环境(1)WINDOWS2000/XP系统(2)Visual C+ 6.0编译环境或TC编译环境2.3 开发工具C语言3 分析和设计3.1 系统分析及设计思路设序列X=x1,x2,xm和Y=y1,y2,yn的最长公共子序列为Z=z1,z2,zk ,则(1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。(2)若xmyn且zkxm,则Z是xm-1和Y的最长公共子序列。(3)若xmyn且zkyn,则Z是X和yn-1的最长公共子序列。由此可见,2个序列
3、的最长公共子序列包含了这2个序列的前缀的最长公共子序列。由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用cij记录序列和的最长公共子序列的长度。其中, Xi=x1,x2,xi;Yj=y1,y2,yj。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时Cij=0。程序的设计思路是:调用函数void Initialize(),输入两个字符串,对两个串的存储数组b,c进行动态分配。调用函数void LCSLength(int m,int n,string x,string y,int*c,int*b),将长度较小的字符串作为第一参数,将长度较大的字符串作为第二个参数。调
4、用函数void LCS(inti,int j,string x,int*b)构造最长公共子序列调用函数。调用函数ReadCommand进行系统操作屏幕指示,然后利用函数void Interpret(char&cmd)对函数进行总体操作,最后得出最长公共子序列。3.2 主要数据结构及算法动态申请两个字符串的存储空间:using namespace std;string x,y系统操作屏幕指示: ReadCommand(cmd)字符串比较函数:void LCSLength(int m,int n,string x,string y,int*c,int*b)构造最长公共子序列调用函数:void LC
5、S(inti,int j,string x,int*b)动态申请两个字符串的存储空间:using namespace std;string x,y3.3 函数流程图Realese()/释放指针boarci=newtn+1;bi=new intn+1;int i=0;i=m;i+m=x.length();n=y.length();c=new int*m+1;b=new intm+1;开始 using namespace stdstringx,y;int*c,*b,m,n;char cmd;ReadCommand(cmd);Interpret(cmd);cmd!=q&cmd!=Q N Yretur
6、n 0ReadCommand(char&cmd) coutcmd;coutcmd!=c&cmd!C&cmd!=q&cmd!=Q); N Y Initialize()m=x.length();n=y.length();c=new int*m+1;b=new intm+1; int i=0;i=m;i+ N Y Realese()/释放指针boardci=newtn+1;bi=new intn+1;delete ci;delete bi;deletec;deleteb;interpret(char&cmd)switch(cmd)casec:caseC;Initialize();LCSLength(
7、m,n,x,y,c,b);Display();Realese();break;LCSLength(int m,int n,string x,string y,int*c,int*bint i=0;i=ij-1cij=ci-1j;bij=2;(i=0;i=m;i+)ci0=0;(i=1;i=n;i+)c0i=0;i=1;i=m;i+;j=1;j=n;j+; N Y N Y N YLCS(int i,int j,string x,int *b)i=0|j=0cij=cij-1;bij=3return bij=1 N Y N Ybij=2LCS(i-1,j,x,b)LCS(I,j-1,x,b)Dis
8、piay()结束LCS(i-1,j-1,x,b);countxi-1;图3.1 程序总体流程图流程图4 具体代码实现#include#includeusing namespace std;string x,y;/x,y用来存放字符序列int *c,*b,m,n;/*m,n分别存储字符串x,y的长度,数组cij存储Xi和Yj得最长公共子序列的长度,bij记录cij的值是有哪一个子问题的解得到的*/void LCSLength(int m,int n,string x,string y,int *c,int*b);void LCS(int i,int j,string x,int *b);void
9、 Initialize();/对数组b,c动态分配空间以及对其进行初始化void ReadCommand(char &cmd);void Interpret(char &cmd);void Realese();/释放指针void Display();int main()char cmd;doReadCommand(cmd);Interpret(cmd);while(cmd!=q&cmd!=Q);return 0;void ReadCommand(char &cmd)system(cls); /清屏coutn-n;coutntttt操 作 提 示;coutn-n;couttquit-q/Q tt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最长 公共 序列 问题 21
限制150内