原题目链接HDU5707
分类
CodeForces KMP
题意
给a,b,c三个串,看c,能否由a,b构成 不能交换a, b中字符顺序, 子序列
思路
dp[i][j]表示c的前i+j个字符,能否由a的前i个,b的前j个构成,dp[0][0]=1(用1表示能构成)
状态转移:当a[i]==c[i+j]时,考虑dp[i-1][j],
当b[j]=c[i+j]时,考虑dp[i][j-1]
样例
Sample Input
abc
def
adebcf
abc
def
abecdf
Sample Output
Yes
No
代码
93ms
/**
* Author: GatesMa
* Email: gatesma@foxmail.com
* Todo: ACM Training
* Date:2018/11/16
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2222;
char a[maxn], b[maxn], c[maxn];
int dp[maxn][maxn];
int main()
{
while(cin >> a >> b >> c)
{
int la = strlen(a);
int lb = strlen(b);
int lc = strlen(c);
dp[0][0] = 1;
for(int i = 0; i <= la;i++){
for(int j = 0;j <= lb;j++){
if(i && j) dp[i][j] = 0;
if(i)
{
dp[i][j] = dp[i-1][j] && (a[i - 1] == c[i + j - 1]);
}
if(j)
{
dp[i][j] |= dp[i][j-1] && (b[j - 1] == c[i + j - 1]);
}
}
}
if(dp[la][lb] == 1 && la + lb == lc)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}