1. 2维 DP。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
const int n1 = s1.size();
const int n2 = s2.size();
const int n3 = s3.size();
if(n1 == 0) return s2 == s3;
if(n2 == 0) return s1 == s3;
if(n3 != n1+n2) return false;
vector<vector<bool> > f(n1+1, vector<bool>(n2+1, true));
f[0][0] = true;
for(int i=1; i<=n1; i++)
f[i][0] = f[i-1][0] && s3[i-1] == s1[i-1];
for(int j=1; j<=n2; j++)
f[0][j] = f[0][j-1] && s3[j-1] == s2[j-1];
for(int i=1; i<=n1; i++)
{
for(int j=1; j<=n2; j++)
{
f[i][j] = (f[i-1][j] && s1[i-1] == s3[i+j-1])
|| (f[i][j-1] && s2[j-1] == s3[i+j-1]);
}
}
return f[n1][n2];
}
};
2维DP + 滚动数组。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
const int n1 = s1.size();
const int n2 = s2.size();
const int n3 = s3.size();
if(n1 == 0) return s2 == s3;
if(n2 == 0) return s1 == s3;
if(n3 != n1+n2) return false;
vector<bool> f(n2+1, true);
f[0] = true;
for(int j=1; j<=n2; j++)
f[j] = f[j-1] && s3[j-1] == s2[j-1];
for(int i=1; i<=n1; i++)
{
f[0] = f[0] && s3[i-1] == s1[i-1];
for(int j=1; j<=n2; j++)
{
f[j] = (f[j] && s1[i-1] == s3[i+j-1])
|| (f[j-1] && s2[j-1] == s3[i+j-1]);
}
}
return f[n2];
}
};