最长公共子序列问题

来源:互联网 发布:超市毛利率算法 编辑:程序博客网 时间:2024/06/14 09:21
输入

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

输出

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

输入示例

abcicbaabdkscab

输出示例

abca

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char s1[1000],s2[1000];int len1,len2,dp[1000][1000],mark[1000][1000];void LCS(){    int i,j;    memset(dp,0,sizeof(dp));    for(i = 0;i<=len1;i++)    mark[i][0] = 1;//对于前一个字符串所有标记为1;     for(i = 0;i<=len2;i++)    mark[0][i] = -1;//第二个字符串标记为-1;     for(i = 1; i<=len1; i++)    {        for(j = 1; j<=len2; j++)        {            if(s1[i-1]==s2[j-1])            {                dp[i][j] = dp[i-1][j-1]+1;                mark[i][j] = 0;//第一个字符串i位置,与第二个字符串j位置相等,标记为零             }            else if(dp[i-1][j]>=dp[i][j-1])            {                dp[i][j] = dp[i-1][j];                mark[i][j] = 1;//s2[j-1]已重             }            else            {                dp[i][j] = dp[i][j-1];                mark[i][j] = -1;//s2[j-1]无重             }        }    }}void PrintLCS(int i,int j)//回溯输出 {    if(!i && !j)    return ;    if(mark[i][j]==0)    {        PrintLCS(i-1,j-1);        printf("%c",s1[i-1]);    }    else if(mark[i][j]==1)    {        PrintLCS(i-1,j);        }    else    {        PrintLCS(i,j-1);          }}int main(){    while(~scanf("%s%s",s1,s2))    {        len1 = strlen(s1);        len2 = strlen(s2);        LCS();        PrintLCS(len1,len2);        printf("\n");    }    return 0;}


0 0