最长公共子序列

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  一、算法思想

  一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。最长公共子序列就是求给定两个序列的一个最长公共子序列。动态规划可以有效的解决此问题。由最长公共子序列问题的子序列的最优子结构性质,可以建立子问题最优的递归关系。用c[i][j]记录序列Xi和Yi的最长公共子序列的长度,递归关系如下:

  0 i=0,j=0

  c[i][j]= c[i-1][j][j-1]+1 i,j> 0;xi==yj

  max c[i][j-1],c[i-1][j] I,j> 0;xi==yj

  在具体的算法设计中,以序列X= { x1,x2,x3,…,xm }和Y= {y1,y2,y3,…,ym}作为输入。输出三个数组c,b,temp。其中c[i][j]存储Xi和Yj的公共子序列的长度,b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的,这在构造最长公共子序列时要用到。问题得最优解,即X和Y得最长公共子序列记录在temp[h]中。

  二、源代码

  下面是在Microsoft Visual C++ 6.0中编写的求最长公共子序列的源程序,程序定义了最大得字符串长度为99,是将p48页的动态规划算法改写而来的。

  #include

  #include

  #define MAX 99

  //typedef char MM;

  void main()

  { int i,j,m,n,h=0;

  char x[MAX]={ ' ', ' '},y[MAX]={ ' ', ' '},b[MAX][MAX]={ ' '};

  int c[MAX][MAX]={0};

  char temp[MAX]={ ' '};

  cout < < "**本程序可以求得字符数在99以内的任意两个字符串的最大公共子序列**/n ";

  cout < < "请输入第一个字符串的长度m= ";

  cin> > m;

  cout < < "请输入第一个字符串(“回车”结束)/n如果输入的字符数超过m,则会出错!/nx[ " <

  for(i=1;i <=m;i++)

  cin> > x[i]; //键盘输入x和y

  cout < < "请输入第二个字符串的长度n= ";

  cin> > n;

上一页1234下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答