Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
刚开始打算用递归做,结果TLE,索性就采用动态规划。
dp[i][j]表示在s1中取i个元素,s2中取j个元素,看是否能和s3中i+j个元素匹配得上。
具体操作为:
d[0][0]=true;
初始化d[i][0],即把s1中的元素全部放在前面比较,初始化d[0][j]同理。
当计算dp[i][j]时,按照状态转移方程即可:
dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i+j-1]) || (dp[i][j-1] && s2[j-1] == s3[i+j-1]);
最后的得到的dp[row][col]就是匹配结果。
可打表进行验证。
详细代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int row=s1.length();
int col=s2.length();
if(row+col!=s3.length())
return false;
vector<vector<bool> > dp(row+1, vector<bool>(col+1, false));
dp[0][0]=true;
for (int j = 1; j <=col; j++)
dp[0][j]=dp[0][j-1]&&(s2[j-1]==s3[j-1]);
for (int i = 1; i <= row; i++)
dp[i][0]=dp[i-1][0]&&(s1[i-1]==s3[i-1]);
for(int i=1;i<=row;i++)
{
for (int j = 1; j <=col; j++)
{
if((dp[i][j-1]&&s2[j-1]==s3[i+j-1])||(dp[i-1][j]&&s1[i-1]==s3[i+j-1]))
dp[i][j]=true;
else
dp[i][j]=false;
}
}
return dp[row][col];
}
};