我正在调试以下问题。发布详细的问题陈述和编码。我的问题是,是否(else if (A[i-1]==C[i+j-1] && B[j-1]==C[i+j-1])
)是否必要的最后一个?我认为没有必要,因为它始终由else if(A[i-1]==C[i+j-1] && B[j-1]!=C[i+j-1])
覆盖,或由else if (A[i-1]!=C[i+j-1] && B[j-1]==C[i+j-1])
覆盖,即前两个if-else检查条件。感谢。
给定s1,s2,s3,找出s3是否由s1和s2的交织形成。
例如, 鉴于: s1 =" aabcc", s2 =" dbbca",
当s3 =" aadbbcbcac"时,返回true。 当s3 =" aadbbbaccc"时,返回false。
// The main function that returns true if C is
// an interleaving of A and B, otherwise false.
bool isInterleaved(char* A, char* B, char* C)
{
// Find lengths of the two strings
int M = strlen(A), N = strlen(B);
// Let us create a 2D table to store solutions of
// subproblems. C[i][j] will be true if C[0..i+j-1]
// is an interleaving of A[0..i-1] and B[0..j-1].
bool IL[M+1][N+1];
memset(IL, 0, sizeof(IL)); // Initialize all values as false.
// C can be an interleaving of A and B only of sum
// of lengths of A & B is equal to length of C.
if ((M+N) != strlen(C))
return false;
// Process all characters of A and B
for (int i=0; i<=M; ++i)
{
for (int j=0; j<=N; ++j)
{
// two empty strings have an empty string
// as interleaving
if (i==0 && j==0)
IL[i][j] = true;
// A is empty
else if (i==0 && B[j-1]==C[j-1])
IL[i][j] = IL[i][j-1];
// B is empty
else if (j==0 && A[i-1]==C[i-1])
IL[i][j] = IL[i-1][j];
// Current character of C matches with current character of A,
// but doesn't match with current character of B
else if(A[i-1]==C[i+j-1] && B[j-1]!=C[i+j-1])
IL[i][j] = IL[i-1][j];
// Current character of C matches with current character of B,
// but doesn't match with current character of A
else if (A[i-1]!=C[i+j-1] && B[j-1]==C[i+j-1])
IL[i][j] = IL[i][j-1];
// Current character of C matches with that of both A and B
else if (A[i-1]==C[i+j-1] && B[j-1]==C[i+j-1])
IL[i][j]=(IL[i-1][j] || IL[i][j-1]) ;
}
}
return IL[M][N];
}
提前谢谢,
林
答案 0 :(得分:2)
当C中的下一个字符与A和B中的下一个字符匹配时,您需要使用最终else if
来捕获案例。例如,使用A="aaaa"
,{{1}运行您的程序}和B="aaaa"
并查看您是否输入了最后一个C="aaaaaaaa"
块。
此外,您还需要一个最终else if
块来处理以前的条件都不匹配的情况。在这种情况下,您需要将else
设置为IL[i][j]
。否则,该函数将错误地返回false
。
编辑:即使代码使用true
初始化memset
到IL
的所有元素,它也可能无效,因为ISO C++ does not support可变长度数组(VLA)。事实上,这就是我tried the code at cpp.sh时发生的事情。它使用带有标志的g ++ - 4.9.2,导致它报告0
为sizeof(IL)
,即使1
应该支持VLA。也许这是一个编译器错误,或者它可能不支持多维VLA。无论如何,根本不使用它们可能更安全。