Algorithm 我的字符串连接递归解决方案正确吗?
问题:给定三个字符串A、B和C。编写一个函数,检查C是否是A和B的交错。如果C包含A和B的所有字符,并且保留单个字符串中所有字符的顺序,则称其为交错A和B。 例子: A=“AB”,B=“CD”,C=CDAB 在这种情况下,C是A和B的串联字符串 我已经用C写了下面的代码。我想知道我是否缺少任何测试用例,或者这是否可以改进。 逻辑只是用A和B检查C的每个字符,并使用递归增加索引Algorithm 我的字符串连接递归解决方案正确吗?,algorithm,recursion,dynamic-programming,Algorithm,Recursion,Dynamic Programming,问题:给定三个字符串A、B和C。编写一个函数,检查C是否是A和B的交错。如果C包含A和B的所有字符,并且保留单个字符串中所有字符的顺序,则称其为交错A和B。 例子: A=“AB”,B=“CD”,C=CDAB 在这种情况下,C是A和B的串联字符串 我已经用C写了下面的代码。我想知道我是否缺少任何测试用例,或者这是否可以改进。 逻辑只是用A和B检查C的每个字符,并使用递归增加索引 #include <stdio.h> int is_concatenated(char *g1, char
#include <stdio.h>
int is_concatenated(char *g1, char *g2, int m, int n, int l, char *target, int i, int j, int k)
{
if (m+n > l)
return 0;
if (k == l)
return 1;
/* for handling duplicated characters in A and B */
if ((i < m ) && g1[i] == target[k] && (j < n) && g2[j] == target[k]) {
return is_concatenated(g1, g2, m, n, l, target, i+1, j, k+1) || is_concatenated(g1, g2, m, n, l, target, i, j+1, k+1);
}
if ((i < m ) && g1[i] == target[k]) {
return is_concatenated(g1, g2, m, n, l, target, i+1, j, k+1);
}
if ((j < n) && g2[j] == target[k]) {
return is_concatenated(g1, g2, m, n, l, target, i, j+1, k+1);
}
return 0;
}
int main(void) {
char *g1 = "ABCD";
char *g2 = "BCDX";
char target[] = {"ABBCDXBCD"};
printf("%d\n", is_concatenated(g1, g2, strlen(g1), strlen(g2), strlen(target), target, 0, 0, 0));
return 0;
}
#包括
int被连接(char*g1,char*g2,intm,intn,intl,char*target,inti,intj,intk)
{
如果(m+n>l)
返回0;
如果(k==l)
返回1;
/*用于处理A和B中的重复字符*/
如果((i
到目前为止,代码看起来是正确的。对这个问题进行了很好的讨论。我喜欢提到std::next_permutation()。也许您可以使用std库函数来测试代码。到目前为止,代码看起来是正确的。对这个问题进行了很好的讨论。我喜欢提到std::next_permutation()。也许您可以使用std库函数来测试代码。到目前为止,代码看起来是正确的。对这个问题进行了很好的讨论。我喜欢提到std::next_permutation()。也许您可以使用std库函数来测试代码。到目前为止,代码看起来是正确的。对这个问题进行了很好的讨论。我喜欢提到std::next_permutation()。也许您可以使用std库函数来测试您的代码。根据问题陈述,我认为您的代码应该为给定的输入打印1。如果我错了,请纠正我
如果输出应该是0,那么您的逻辑和代码就完美无缺了
但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l
当g1中的字符、g2与k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1和g2
希望这能使您的代码给出正确的输出。根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我 如果输出应该是0,那么您的逻辑和代码就完美无缺了 但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l 当g1中的字符、g2与k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1和g2
希望这能使您的代码给出正确的输出。根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我 如果输出应该是0,那么您的逻辑和代码就完美无缺了 但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l 当g1中的字符、g2与k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1和g2
希望这能使您的代码给出正确的输出。根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我 如果输出应该是0,那么您的逻辑和代码就完美无缺了 但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l 当g1中的字符、g2与k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1和g2
希望这能使您的代码给出正确的输出。您的解决方案是正确的,但问题是最坏情况的复杂性是
2^{min(m,n)}
。考虑一下你有这样的情况:
g1 = 1111111111111111111111111111112
g2 = 1111111111111111111111111111113
target = 11111111111111111111111111111131111111111111111111111111111112
那么,您可能对更有效的解决方案感兴趣。有一个使用动态规划的O(nm)
解决方案。其思想是使用一个数组f[i][j]
,其f[i][j]=1
当且仅当target[0…i+j-1]
是g1[0…i-1]
和g2[0…j-1]
的交错 你的溶胶