Algorithm 我的字符串连接递归解决方案正确吗?

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

问题:给定三个字符串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 *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中的字符、g2k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1g2


希望这能使您的代码给出正确的输出。

根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我

如果输出应该是0,那么您的逻辑和代码就完美无缺了

但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l

g1中的字符、g2k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1g2


希望这能使您的代码给出正确的输出。

根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我

如果输出应该是0,那么您的逻辑和代码就完美无缺了

但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l

g1中的字符、g2k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1g2


希望这能使您的代码给出正确的输出。

根据问题陈述,我想您的代码应该为给定的输入打印1。如果我错了,请纠正我

如果输出应该是0,那么您的逻辑和代码就完美无缺了

但是如果输出应该是1,我担心您的代码会为给定的输入返回错误的输出。这是因为对于给定的情况,变量k永远不会达到目标长度l

g1中的字符、g2k目标字符串中的第个字符不匹配时,可以通过增加k使其工作。并检查边界条件中字符串的长度g1g2


希望这能使您的代码给出正确的输出。

您的解决方案是正确的,但问题是最坏情况的复杂性是
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]
的交错

你的溶胶