c_cpp dp,三个字符串表示A,B,C给你。检查天气第3个字符串是从字符串A和B交错出来的。例如:A =“abcd”B =“xyz”C =“axybczd”。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp dp,三个字符串表示A,B,C给你。检查天气第3个字符串是从字符串A和B交错出来的。例如:A =“abcd”B =“xyz”C =“axybczd”。相关的知识,希望对你有一定的参考价值。

bool canInterleave(char *a, char *b, char *c) {
	if(*a == '\0' && *b == '\0' && *c == '\0') return true;
	if(*a == *b) {
		if(*a == *c) return canInterleave(a+1, b, c+1) || canInterleave(a, b+1, c+1);
		else return false;
	}
	if(*a == *c) return canInterleave(a+1, b, c+1);
	if(*b == *c) return canInterleave(a, b+1, c+1);
}

// DP
bool canInterleave(char *a, char *b, char *c) {
	int alen = strlen(a), blen = strlen(b), clen = strlen(c);
	if(alen + blen != clen) return false;
	if(alen == 0 && blen == 0 && clen == 0) return true;

	vector<vector<bool>> dp(alen+1, vector<bool>(blen+1, false));
	dp[0][0] = true; //
	for(int i=1; i<blen+1; i++) {
		if(b[i-1] == c[i-1] && dp[0][i-1]) dp[0][i] = true;
	}
	for(int i=1; i<alen+1; i++) {
		if(a[i-1] == c[i-1] && dp[i-1][0]) dp[i][0] = true;
	}
	for(int i=1; i<alen+1; i++)
		for(int j=1; j<blen+1; j++)
			dp[i][j] = a[i-1]==c[i+j-1] && dp[i-1][j] ||
				b[j-1]==c[i+j-1] && dp[i][j-1];
	return dp[alen][blen];
}

以上是关于c_cpp dp,三个字符串表示A,B,C给你。检查天气第3个字符串是从字符串A和B交错出来的。例如:A =“abcd”B =“xyz”C =“axybczd”。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 给你一个文本文件太大,不适合内存和3个字符串A,B,C。对于每个字符串,你有一个列出位置o的排序数组

hdu1501 Zipper[简单DP]

状压dp Gym - 100676G

计数dp cf1426f Number of Subsequences

计数dp cf1426f Number of Subsequences

计数dp cf1426f Number of Subsequences