
解题步骤:





参考代码:
- 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
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];
- }
- };
你学会了吗???