方法:DP
dp[i][j]表示s1的前i项和s2的前j项是否可以组成s3的前i+j项;
因此构建递推式为:
dp[i + 1][j + 1] =
dp[i][j + 1] && (s1[i] == s3[i + j + 1])
||
dp[i + 1][j] && (s2[j] == s3[i + j + 1])
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int m = s1.length();
int n = s2.length();
if(m + n != s3.length()) {
return false;
}
bool dp[m + 1][n + 1];
//initial
dp[0][0] = true;
for(int i = 0; i < m; ++i) {
dp[i + 1][0] = dp[i][0] && (s1[i] == s3[i]);
}
for(int j = 0; j < n; ++j) {
dp[0][j + 1] = dp[0][j] && (s2[j] == s3[j]);
}
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
dp[i + 1][j + 1] = (dp[i][j + 1] && (s1[i] == s3[i + j + 1])) || (dp[i + 1][j] && (s2[j] == s3[i + j + 1]));
}
}
return dp[m][n];
}
};