class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n = s1.length(), m = s2.length(), l3 = s3.length();
if (n + m != l3)
return false;
if (n == 0)
return s2 == s3;
if (m == 0)
return s1 == s3;
vector<vector<int> > dp(n + 1);
for (int i = 0; i < n + 1; ++i) {
dp[i].resize(m + 1);
}
dp[0][0] = 1;
for (int i = 1; i < n + 1; ++i) {
dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
}
for (int j = 1; j < m + 1; ++j) {
dp[0][j] = dp[0][j - 1] && s2[j - 1] == s3[j - 1];
}
for (int i = 1; i < n + 1; ++i) {
for (int j = 1; j < m + 1; ++j) {
if (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) {
dp[i][j] = 1;
} else if (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]){
dp[i][j] = 1;
} else {
dp[i][j] = 0;
}
}
}
return dp[n][m]? true:false;
}
};