最长公共子序列
给你2个字符串,找出一个一个最短的字符串,同时包含这2个字符串。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define maxn 1100
using namespace std;
int dp[maxn][maxn];
int vis[maxn][maxn];
char s1[maxn],s2[maxn];
void fact(int i,int j)
{
if(i<=0&&j<=0)return ;
if(vis[i][j]==1)
{
fact(i-1,j-1);
printf("%c",s1[i-1]);
}
else if(vis[i][j]==2)//左
{
fact(i,j-1);
printf("%c",s2[j-1]);
}
else//上
{
fact(i-1,j);
printf("%c",s1[i-1]);
}
}
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
int len1=strlen(s1);
int len2=strlen(s2);
memset(dp,0,sizeof(dp));
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i-1]==s2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
vis[i][j]=1;//左上
}
else if(dp[i][j-1]>=dp[i-1][j])
{
dp[i][j]=dp[i][j-1];
vis[i][j]=2;//左
}
else
{
dp[i][j]=dp[i-1][j];
vis[i][j]=3;//上
}
}
}
for(int i=0; i<=len1; i++)
vis[0][i]=2;
for(int i=0; i<=len1; i++)
vis[i][0]=3;
fact(len1,len2);
printf("\n");
}
return 0;
}