【发布时间】: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