我在这里使用 Python 切片语法,因为它很好。S[:-1]
表示字符串S
删除最后一个字符并且S[:n]
表示前缀S
有长度的n
.
关键的想法是如果C
是一个交错A
and B
, then C[:-1]
是一个交错A
and B[:-1]
or of A[:-1]
and B
。另一方面,如果C
是一个交错A
and B
, then C + 'X'
是一个交错A + 'X'
and B
这也是一个交错的A
and B + 'X'
.
这些是我们应用动态规划所需的子结构属性。
我们定义f(i, j) = true
, if s1[:i]
and s2[:j]
可以交错形成s3[:(i+j)]
and f(i,j) = false
否则。通过上面的观察我们有
f(0,0) = true
f(i,0) = f(i-1, 0) if s3[i-1] == s1[i-1]
f(0,j) = f(0, j-1) if s3[j-1] == s2[j-1]
f(i,j) = true if s3[i+j-1] = s1[i-1] and f(i-1, j)
f(i,j) = true if s3[i+j-1] = s2[j-1] and f(i, j-1)
在所有其他情况下,我们有f(i,j) = false
。
Java代码只是使用动态编程来实现这种递归。也就是说,我会以更简洁的方式实现它:
for (int i = 0; i <= s1.length(); ++i)
for (int j = 0; j <= s2.length(); ++j)
isInter[i][j] = (i == 0 && j == 0)
|| (i > 0 && s1.charAt(i-1) == s3.charAt(i+j-1) && isInter[i-1][j])
|| (j > 0 && s2.charAt(j-1) == s3.charAt(i+j-1) && isInter[i][j-1]);