题意:给定三个字符串a,b,c判断c是否由a和b组成,是的话输出Yes,反之输出No
思路:考虑到是多组输入输出,贪心会爆,所以用dp写
注:考虑到string开辟空间问题(string输入多少开辟多少空间),字符串a,b,c最好用char输入
string亲试过(WA了),我不会处理string越界问题呜呜呜
代码解读:dp[i][j]=1(0) 表示a的i位,b的j位(不)等于c的(i+j)位
核心代码:b和c边走边对比,中间在插入a和c的对比,符合条件就dp公式一直推
输出条件:遍历到最后a和b的最后一位字符dp值都是1(a和b所有字符都与c契合),且la+lb==lc
代码附上:
#include<stdio.h>
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=2020;
int dp[N][N];
char a[2020],b[2020],c[2020];
int main()
{
while(cin>>a+1>>b+1>>c+1)
{
memset(dp,0,sizeof(dp));
int l1=strlen(a+1);
int l2=strlen(b+1);
int l3=strlen(c+1);
dp[0][0]=1;
for(int i=0;i<=l1;i++)
{
for(int j=0;j<=l2;j++)
{
if(i+j>=0&&i+j<=l3)
{
if(c[i+j]==a[i]&&i)
{
dp[i][j]=dp[i][j]||dp[i-1][j];
}
if(c[i+j]==b[j]&&j)
{
dp[i][j]=dp[i][j]||dp[i][j-1];
}
}
}
}
if(l1+l2==l3&&dp[l1][l2])
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}