题目:
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.
程序:
递归(超时)
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if ((s1.size() + s2.size()) != s3.size())
return false;
bool flag = false;
solve(s1, s2, s3,flag);
return flag;
}
void solve(string s1, string s2, string s3,bool &flag)
{
if (s3.size() == 0 && s1.size() == 0 && s2.size() == 0)
{
flag=true;
return;
}
if (s1.size() == 0)
{
if (s2 == s3)
{
flag = true;
return;
}
else
{
return;
}
}
if (s2.size() == 0)
{
if (s1 == s3)
{
flag = true;
return;
}
else
{
return;
}
}
if (s1[0] == s3[0])
solve(s1.substr(1), s2, s3.substr(1),flag);
if (s2[0] == s3[0])
solve(s1, s2.substr(1), s3.substr(1),flag);
}
};
方法二:
动态规划
class Solution {
public:
// dp[i][j] 使用s1[0,1,...,i]字符串和s2[0,1,2,...,j]字符串,组合成s3(i+j)
bool isInterleave(string s1, string s2, string s3)
{
int m=s1.length(),n=s2.length(),l=s3.length();
if(m+n != l)
return false;
vector<vector<bool> > dp(m+1,vector<bool>(n+1,false));
dp[0][0] = true;
for(int i=1;i<=m;i++)
dp[i][0] = dp[i-1][0] && s1[i-1] == s3[i-1];
for(int j=1;j<=n;j++)
dp[0][j] = dp[0][j-1] && s2[j-1] == s3[j-1];
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;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]);
}
}
return dp[m][n];
}
};