Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
设f[k][i][j]表示s1[0..i-1]加s2[0..j-1]能否拼成s3[0..k-1],满足:i + j = k。
当f[k - 1][i][j - 1] == true && s2[j - 1] == s3[k - 1]时,f[k][i][j] = true;
或者
当f[k - 1][i - 1][j] == true && s1[i - 1] == s3[k - 1]时,f[k][i][j] = true。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int l1 = s1.length(), l2 = s2.length(), l3 = s3.length();
if (l1 + l2 != l3) {
return false;
}
bool f[l3 + 1][l1 + 1][l2 + 1];
memset(f, false, sizeof(bool) * (l3 + 1) * (l1 + 1) * (l2 + 1));
f[0][0][0] = true;
for (int k = 1; k <= l3; k++) {
for (int i = 0; i <= k && i <= l1; i++) {
int j = k - i;
if (j > l2) {
continue;
}
if (i != 0 && f[k - 1][i - 1][j] && s1[i - 1] == s3[k - 1]) {
f[k][i][j] = true;
}
if (j != 0 && f[k - 1][i][j - 1] && s2[j - 1] == s3[k - 1]) {
f[k][i][j] = true;
}
}
}
return f[l3][l1][l2];
}
};
本文介绍了一种用于判断字符串s3是否能由字符串s1和s2交错组成的有效算法。通过三维动态规划方法,该算法能够高效地解决此问题,并提供了一个C++实现示例。
645

被折叠的 条评论
为什么被折叠?



