正文

最长公共子序列(DP)2007-07-10 18:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27451.html

分享到:

题目:
有两个字符串,求这两个字符串的最长公共子序列,所谓公共子序列是指
下标依次递增的字符串,如 abcdefsg kbcdssssfsg 的最长公共子序列为
bcdgsg,字符串的长度范围为 [1,100]

输入:
多个实例,每个实例两行,每行一个字符串
输出:
形式为 Case x:zzz ,x表示实例序号,从1开始,zzz 表示最长公共子序列
每个实例的输出占一行。

如:
输入:
ab
ab
agbcdf
kkbdckd
abcdefsg
kbcdssssfsg

输出:
Case 1:ab
Case 2:bcf
Case 3:bcdfsg

// my code
#include <stdio.h>
#include <string.h>
char a[100],b[100],m[101][101]={0};
void putOut(int i, int j){
 if(i==0 || j==0)
  return;
 else if(m[i][j] == m[i-1][j-1]+1){
  putOut(i-1,j-1);
  putchar(a[i-1]);
 }
 else if(m[i][j] > m[i-1][j])
  putOut(i,j-1);
 else
  putOut(i-1,j);
}

int main(void){
 unsigned int  i,j,n=1;
 while(gets(a)!=NULL){
  gets(b);
  for(i=1; i<=strlen(a); i++)
   for(j=1; j<=strlen(b); j++){
    if(a[i-1] == b[j-1])
     m[i][j] = m[i-1][j-1]+1;
    else if(m[i-1][j] > m[i][j-1])
     m[i][j] = m[i-1][j];
    else
     m[i][j] = m[i][j-1];
   }
  printf("Case %u:",n++);
  putOut(strlen(a),strlen(b));
  putchar('\n');
 }
 return 0;
}

阅读(3270) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册