【问题标题】:Is my recursive solution for string concatenation right?我对字符串连接的递归解决方案对吗?
【发布时间】:2015-10-05 00:33:01
【问题描述】:

问题:给定三个字符串 A、B 和 C。编写一个函数,检查 C 是否是 A 和 B 的交错。如果 C 包含 A 和 B 的所有字符和顺序,则称 C 是交错 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;
}

【问题讨论】:

    标签: algorithm recursion dynamic-programming


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      到目前为止,代码看起来是正确的。 Here 很好地讨论了这个问题。我喜欢提到 std::next_permutation()。也许您可以使用 std 库函数来测试您的代码。

      【讨论】:

        【解决方案3】:

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

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

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

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

        希望这能让你的代码给出正确的输出。

        【讨论】:

        • @noman- 怎么是0!目标字符串中是否允许除 2 个字符串之外的额外字符?
        • 不。检查我的问题中的示例。它应该只是按顺序排列,没有多余的字符。
        • 那就不是答案
        • @washington - 我同意。我只是想提供我的意见。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        相关资源
        最近更新 更多