动归超时解:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if (s3.size() != (s1.size() + s2.size()))
return false;
return _isInterleave(s1, s2, s3);
}
bool _isInterleave(string s1, string s2, string s3) {
if (s3.size() == 0 && s1.size() == 0 && s2.size() == 0)
return true;
if (s1.size() != 0 && s1[0] == s3[0])
{
string t_s1(s1.begin() + 1, s1.end());
string t_s3(s3.begin() + 1, s3.end());
if (_isInterleave(t_s1, s2, t_s3))
return true;
}
if (s2.size() != 0 && s2[0] == s3[0])
{
string t_s2(s2.begin() + 1, s2.end());
string t_s3(s3.begin() + 1, s3.end());
if (_isInterleave(s1, t_s2, t_s3))
return true;
}
return false;
}
};
AC解
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s3.length() != s1.length() + s2.length())
return false;
vector<vector<bool>> dp(s1.length()+1,vector<bool>(s2.length()+1,0));
dp[0][0] = true;
for (int i = 1; i <= s1.length(); i++)
{
if (s1[i-1] == s3[i-1] && dp[i - 1][0])
dp[i][0] = true;
}
for (int i = 1; i <= s2.length(); i++)
{
if (s2[i-1] == s3[i-1] && dp[0][i-1])
dp[0][i] = true;
}
for (int i = 1; i <= s1.length(); i++)
{
for (int j = 1; j <= s2.length(); j++)
{
if (s3[i + j - 1] == s1[i - 1] && dp[i - 1][j])
dp[i][j] = true;
if (s3[i + j - 1] == s2[j - 1] && dp[i][j-1])
dp[i][j] = true;
}
}
return dp[s1.length()][s2.length()];
}
};