注:dp[i][j]为a串中长度为i的前缀串和b串中长度为j的前缀串能否组成c串中长度为i+j的前缀串的标志,且dp[0][0]=1
当c串i+j-1位置的字符与a串i-1位置的字符相同时,需要看的是a串中长度为i-1的前缀串和b串中长度为j的前缀串能否组成c串中长度为i+j-1的前缀串;
当c串i+j-1位置的字符与b串i-1位置的字符相同时,需要看的是a串中长度为i的前缀串和b串中长度为j-1的前缀串能否组成c串中长度为i+j-1的前缀串;
#include<iostream>
#include<cstring>
using namespace std;
string a,b,c;
int dp[300][300];
int main ()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c;
memset(dp,0,sizeof(dp));
cout<<"Data set "<<i<<": ";
int lena=a.size();
int lenb=b.size();
dp[0][0]=1;
for(int j=0;j<=lenb;j++){
for(int i=0;i<=lena;i++) {
if(j>0&&dp[i][j-1]&&c[i+j-1]==b[j-1])
dp[i][j]=1;
if(i>0&&dp[i-1][j]&&c[i+j-1]==a[i-1])
dp[i][j]=1;
}
}
cout<<(dp[lena][lenb]?"yes":"no")<<endl;
}
return 0;
}