给出3个字符串,判断第3个字符串能否由前面2个字符串组成,要求字符顺序不变
动态规划,我觉得我的代码是错误的,我查看了中间数据是错的,但是提交就是对的,害得我检查了好久
d[n][m]:=1,表示a串的前n个字符,b串的前m个字符可以组成c串的前n+m个字符,如果等于0则表示不可以
a[n-1]=c[n+m-1],dp(n,m)=dp(n-1,m)||dp(n,m)
b[m-1]=c[n+m-1],dp(n,m)=dp(n,m-1)||dp(n,m)
#include <bits/stdc++.h>
using namespace std;
string a,b,c;
int d[205][205];
int dp(int n,int m)
{
if (d[n][m]!=0) return d[n][m];
if (n==0){
if (m==0) d[n][m]=1;
else
{
if (b[m-1]==c[n+m-1]){
return d[0][m]=(dp(0,m-1)||d[0][m]);
}
}
}
else
{
if (m==0){
if (a[n-1]==c[n+m-1]){
d[n][0]=(dp(n-1,0)||d[n][0]);
}
}
else
{
if (a[n-1]==c[n+m-1]){
d[n][m]=(dp(n-1,m)||d[n][m]);
}
if (b[m-1]==c[n+m-1]){
d[n][m]=(dp(n,m-1)||d[n][m]);
}
}
}
return d[n][m];
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF){
for (int is=1;is<=t;is++){
cin>>a>>b>>c;
memset(d,0,sizeof(d));
dp(a.length(),b.length());
printf("Data set %d: ",is);
if (d[a.length()][b.length()]){
printf("yes\n");
} else printf("no\n");
}
}
return 0;
}