本来是打算贪心水一发,然后发现如果出现第一个和第二个序列中出现同样元素的情况的时候是会造成误判的,
也可以递归的算法,但是应该会TLE。所以就用dp!
dp真是个好算法
dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j])||(dp[i][j-1]&&b[j]==c[i+j]);
是状态转移方程,
但是在i=0或者j=0的时候要特判一下防止re;
i和j意思是取第一个序列的第i个,取第二个序列的第j个
#include<bits/stdc++.h>
using namespace std;
char a[2005];
char b[2005];
char c[2005];
int dp[2005][2005];
int main(){
int i;
while(~scanf("%s",a+1)){
scanf("%s",b+1);
scanf("%s",c+1);
memset(dp,0,sizeof(dp));
dp[0][0]=1;
if(strlen(a+1)+strlen(b+1)!=strlen(c+1)){
printf("No\n");
continue;
}
for(int i=0;i<=strlen(a+1);i++){
for(int j=0;j<=strlen(b+1);j++){
if(i==0&&j==0){
continue;
}
if(i==0){
dp[i][j]=(dp[i][j-1]&&b[j]==c[i+j]);
}
else if(j==0){
dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j]);
}
else{
dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j])||(dp[i][j-1]&&b[j]==c[i+j]);
}
}
}
if(dp[strlen(a+1)][strlen(b+1)])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}