最长公共子序列

来源:互联网 发布:英雄杀mac客户端 编辑:程序博客网 时间:2024/06/05 14:25

最长公共子序列

输入

第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)

输出

输出最长的子序列,如果有多个,随意输出1个。

输入示例

abcicbaabdkscab

输出示例

abca

#include <iostream>#include <cstdio>#include <cstring>#include <stack> #include <algorithm>using namespace std;const int MAX=1e3+10;int dp[MAX][MAX];int d[MAX][MAX],p[MAX];int k1,k2,m;char str1[MAX],str2[MAX];void  printdp(int k1,int k2){if(k1 == 0 || k2 == 0)   return ;else if(d[k1][k2] == 0)   {      p[m++] = str1[k1];  //将字符倒序存进数组里       printdp(k1-1,k2-1);   }   else  if(d[k1][k2] == 1)    {      printdp(k1-1,k2); }  else if(d[k1][k2] == -1) printdp(k1,k2-1);}int main(){       scanf("%s %s",str1+1,str2+1);    memset(dp , 0 ,sizeof(dp));    str1[0] = str2[0] = '0';      k1 = strlen(str1)-1;     k2 = strlen(str2)-1;    for(int i = 1; i <= k1 ; i++)          for(int j = 1; j <= k2; j++)           {                 if(str1[i] == str2[j])                       {   dp[i][j] = dp[i-1][j-1] + 1;    d[i][j] = 0; //左上方                    }               else  if(dp[i-1][j] > dp[i][j-1])                      {                         dp[i][j] = dp[i-1][j];                         d[i][j] = 1; //左方  } else { dp[i][j] = dp[i][j-1];  d[i][j] = -1; //上方  }    }    m = 0;  printdp(k1,k2);   for(int i = m-1; i >=0 ; i--)  printf("%c",p[i]); //正序输出   printf("\n");return 0; } 



原创粉丝点击