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.
Code:
<span style="font-size:14px;">class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int length1 = s1.size(), length2 = s2.size(), length3 = s3.size();
if (length1+length2 != length3) return false;
bool ***dp = new bool **[length1+1];
for (int i = 0; i < length1+1; i++) {
dp[i] = new bool *[length2+1];
for (int j = 0; j < length2+1; j++) {
dp[i][j] = new bool[length3+1];
memset(dp[i][j], false, sizeof(bool)*(length3+1));
}
}
dp[0][0][0] = true;
for (int k = 1; k < length3+1; k++) {
for (int i = 0; i <= k && i < length1+1; i++) {
int j = k-i;
if (j > length2) continue;
if ((i != 0 && s1[i-1] == s3[k-1] && dp[i-1][j][k-1]) ||
(j != 0 && s2[j-1] == s3[k-1] && dp[i][j-1][k-1])) {
dp[i][j][k] = true;
}
}
}
bool result = dp[length1][length2][length3];
for (int i = 0; i < length1+1; i++) {
for (int j = 0; j < length2+1; j++)
delete [] dp[i][j];
delete [] dp[i];
}
delete [] dp;
return result;
}
};</span>