class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int m=s1.size();
int n=s2.size();
int k=s3.size();
if(m+n!=k)
return false;
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));//dp[i][j]表示s1取i位,s2取j位,能否组成s3的i+j位。新添加的字符等于s3的第i+j位字符,之前那个格子也要为true,则为true。
dp[0][0]=true;
for(int i=1;i<m+1;i++)
{
if(s1[i-1]==s3[i-1]&&dp[i-1][0])
dp[i][0]=true;
}
for(int j=1;j<n+1;j++)
{
if(s2[j-1]==s3[j-1]&&dp[0][j-1])
dp[0][j]=true;
}
for(int i=1;i<m+1;i++)
{
for(int j=1;j<n+1;j++)
{
if(s1[i-1]==s3[i+j-1]&&dp[i-1][j])
dp[i][j]=true;
if(s2[j-1]==s3[i+j-1]&&dp[i][j-1])
dp[i][j]=true;
}
}
return dp[m][n];
}
};
public:
bool isInterleave(string s1, string s2, string s3) {
int m=s1.size();
int n=s2.size();
int k=s3.size();
if(m+n!=k)
return false;
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));//dp[i][j]表示s1取i位,s2取j位,能否组成s3的i+j位。新添加的字符等于s3的第i+j位字符,之前那个格子也要为true,则为true。
dp[0][0]=true;
for(int i=1;i<m+1;i++)
{
if(s1[i-1]==s3[i-1]&&dp[i-1][0])
dp[i][0]=true;
}
for(int j=1;j<n+1;j++)
{
if(s2[j-1]==s3[j-1]&&dp[0][j-1])
dp[0][j]=true;
}
for(int i=1;i<m+1;i++)
{
for(int j=1;j<n+1;j++)
{
if(s1[i-1]==s3[i+j-1]&&dp[i-1][j])
dp[i][j]=true;
if(s2[j-1]==s3[i+j-1]&&dp[i][j-1])
dp[i][j]=true;
}
}
return dp[m][n];
}
};