题意:给定三个字符串,问你第三个是不是由第一个和第二个组成的。
析:当时比赛是没有做出来啊。。。一直WA,就是没有判断长度,第一个和第二个和是不是和第三个一样,这个忘记。。。
我们用d[i][j]表示第一个字符串匹配到 i, 第二个匹配到第 j 个,然后只要判断能不能由上一个得到就好。这个主要是d[i][j]==1则表示可以成功匹配
d[i][j]==0则表示无法成功匹配,那么剩下的就简单了。
代码如下:
#include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <queue> #include <algorithm> #include <vector> #include <map> using namespace std ; typedef long long LL; typedef pair<int, int> P; const int INF = 0x3f3f3f3f; const double inf = 0x3f3f3f3f3f3f3f; const double eps = 1e-8; const int maxn = 2000 + 5; const int dr[] = {0, 0, -1, 1}; const int dc[] = {-1, 1, 0, 0}; //int n, m; char s[maxn], t[maxn], ss[maxn]; int d[maxn][maxn]; int main(){ // int T; cin >> T; while(scanf("%s", s+1) == 1){ scanf("%s", t+1); scanf("%s", ss+1); memset(d, 0, sizeof(d)); int n = strlen(s+1); int m = strlen(t+1); int ans = 0; if(n+m != strlen(ss+1)){ printf("No\n"); continue; } d[0][0] = 1; for(int i = 0; i <= n; ++i){ for(int j = 0; j <= m; ++j){ if(ss[i+j] == s[i] && i) d[i][j] |= d[i-1][j]; if(ss[i+j] == t[j] && j) d[i][j] |= d[i][j-1]; } } printf("%s\n", d[n][m] ? "Yes" : "No"); } return 0; }