这个题要求求出C字符串能否由A字符串和B字符串组成
类似LCS,将字符串进行分别进行状态转移即可
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(str1[i-1]==str[dp[i-1][j]])
dp[i][j]=dp[i-1][j]+1;
if(str2[j-1]==str[dp[i][j-1]])
dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1001;
char str1[maxn],str2[maxn],str[maxn];
int lena,lenb,len,dp[maxn][maxn];
bool vis[30];
bool Judge()
{
for(int i=0;i<lena;i++)
vis[str1[i]-'0']=1;
for(int i=0;i<lenb;i++)
vis[str2[i]-'0']=1;
for(int i=0;i<len;i++)
if(!vis[str[i]-'0'])
return false;
return true;
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
scanf("%s%s%s",str1,str2,str);
lena=strlen(str1);
lenb=strlen(str2);
len=strlen(str);
if(len>lena+lenb||!Judge())
{
printf("Data set %d: no\n",cas++);
continue;
}
memset(dp,0,sizeof(dp));
bool ans=0;
for(int i=1;i<=lena;i++)
{
dp[i][0]=dp[i-1][0];
if(str1[i-1]==str[dp[i][0]])
dp[i][0]++;
}
for(int i=1;i<=lenb;i++)
{
dp[0][i]=dp[0][i-1];
if(str2[i-1]==str[dp[0][i]])
dp[0][i]++;
}
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(str1[i-1]==str[dp[i-1][j]])
dp[i][j]=dp[i-1][j]+1;
if(str2[j-1]==str[dp[i][j-1]])
dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
if(dp[i][j]>=len)
{
ans=1;
break;
}
}
if(ans)
printf("Data set %d: yes\n",cas++);
else
printf("Data set %d: no\n",cas++);
}
return 0;
}