#include <cstdio>
#include <cstring>
int dp[110][110], c[110][110];
char a[110], b[110], str[110];
int la, lb, l;
void find(int i, int j)
{
if(i==0 || j==0)
return;
if(c[i][j] == 1)
{
str[l] = a[i];
l--;
find(i-1, j-1);
}
else if(c[i][j] == 2)
find(i-1, j);
else
find(i, j-1);
}
int main()
{
int t;
scanf("%d", &t);
getchar();
while(t--)
{
scanf("%s", a+1);
scanf("%s", b+1);
la = strlen(a+1);
lb = strlen(b+1);
for(int i=0; i<=la; i++)
dp[i][0] = 0;
for(int i=1; i<=lb; i++)
dp[0][i] = 0;
for(int i=1; i<=la; i++)
for(int j=1; j<=lb; j++)
{
if(a[i] == b[j])
{
dp[i][j] = dp[i-1][j-1] + 1;
c[i][j] = 1;
}
else if(dp[i-1][j] >= dp[i][j-1])
{
dp[i][j] = dp[i-1][j];
c[i][j] = 2;
}
else
{
dp[i][j] = dp[i][j-1];
c[i][j] = 3;
}
}
printf("%d ", dp[la][lb]);
l = dp[la][lb];
find(la, lb);
for(int i=1; i<=dp[la][lb]; i++)
printf("%c", str[i]);
printf("\n");
}
return 0;
}
最长公共子序列的动态规划求解
最新推荐文章于 2023-05-11 19:21:25 发布