解题步骤:
参考代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int m=s1.size();
int n=s2.size();
//先判断s1的长度+s2的长度是否等于s3的长度,如果不等,则s1和s2不可能拼接成s3
if(m+n!=s3.size())
{
return false;
}
//处理下标映射关系
s1=' '+s1;
s2=' '+s2;
s3=' '+s3;
vector<vector<bool>> dp(m+1,vector<bool>(n+1));
//初始化第一行
dp[0][0]=true;
for(size_t j=1;j<=n;j++)
{
if(s2[j]==s3[j])
{
dp[0][j]=true;
}
else
{
break;
}
}
//初始化第一列
for(size_t i=1;i<=m;i++)
{
if(s1[i]==s3[i])
{
dp[i][0]=true;
}
else
{
break;
}
}
//填表
//参考状态转移方程
for(size_t i=1;i<=m;i++)
{
for(size_t j=1;j<=n;j++)
{
if(s1[i]==s3[i+j]&&dp[i-1][j])
{
dp[i][j]=true;
}
else if(s2[j]==s3[i+j]&&dp[i][j-1])
{
dp[i][j]=true;
}
}
}
//返回值
return dp[m][n];
}
};
你学会了吗???