HDU 5707 Many Equal Substrings

原题目链接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: [email protected]
 * 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40456064/article/details/84143438
今日推荐