题目描述
给定字符串a, b和c,BSNY想知道c是否可以由a和b组合得到。
这里组合指的是:c串可以分解成两个子序列,这两个子序列分别构成a和b。
例如:adebcf可以由abc和def组合。
输入
第一行输入T,表示有T组测试数据
对于每组测试数据,输入三个字符串,分别表示a,b,c
输出
如果符合要求输出”Yes”,否则输出”No”
样例输入
2
abc
def
adebcf
abc
def
abecdf
样例输出
Yes
No
提示
1<=T<=20 1<=字符串长度<=2000
我是渣渣round2
我们发现,三个字符串a,b,c,c中的字符不属于a就属于b,我们可以yy出一个搜索,然后改成记忆化
为什么我考试的时候又没想出来。。。我真渣。。。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int t,n,m,p;
int f[2005][2005];
char a[2005],b[2005],c[2005];
int dfs(int k1,int k2,int k3)
{
if(k3>p)
{
if(k1==n+1&&k2==m+1) return 1;else return 0;
}
if(f[k1][k2]!=-1) return f[k1][k2];
int s=0;
if(k1<=n&&a[k1]==c[k3]) s=s|dfs(k1+1,k2,k3+1);
if(k2<=m&&b[k2]==c[k3]) s=s|dfs(k1,k2+1,k3+1);
return f[k1][k2]=s;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%s",a+1);
scanf("%s",b+1);
scanf("%s",c+1);
n=strlen(a+1);
m=strlen(b+1);
p=strlen(c+1);
for(int i=1;i<=n+1;i++)
for(int j=1;j<=m+1;j++) f[i][j]=-1;
if(dfs(1,1,1)) cout<<"Yes"<<endl; else cout<<"No"<<endl;
}
return 0;
}