版权声明:本文为自学而写,如有错误还望指出,谢谢^-^ https://blog.csdn.net/weixin_43871369/article/details/90746952
题目描述
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.
Solution 1
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s3.size()!=s2.size()+s1.size()) return false;
vector<vector<bool> > dp(s1.size()+1,vector<bool>(s2.size()+1,false));
dp[0][0]=true;
for(int i=1;i<s1.size()+1;++i)
dp[i][0]=dp[i-1][0]&&s1[i-1]==s3[i-1];
for(int i=1;i<s2.size()+1;++i)
dp[0][i]=dp[0][i-1]&&s2[i-1]==s3[i-1];
for(int i=1;i<s1.size()+1;++i)
for(int j=1;j<s2.size()+1;++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[s1.size()][s2.size()];
}
};
Solution 2
//常规算法
bool isInterleave(string s1, string s2, string s3) {
if(s1.size()==0&&s2.size()==0&&s3.size()==0) return true;
if(s3.size()==0) return false;
if(s2.size()==0&&s1==s3) return true;
if(s1.size()==0&&s2==s3) return true;
if(s1.size()!=0&&s2.size()!=0&&s3.size()!=0)
{
if(s3[0]==s1[0]&&s3[0]==s2[0])
return isInterleave(s1.substr(1,s1.size()),
s2,s3.substr(1,s3.size()))||isInterleave(s1,s2.substr(1,s2.size()),
s3.substr(1,s3.size()));
else if(s3[0]==s1[0]) return isInterleave(s1.substr(1,s1.size()),
s2,s3.substr(1,s3.size()));
else if(s3[0]==s2[0]) return isInterleave(s1,s2.substr(1,s2.size()),
s3.substr(1,s3.size()));
else return false;
}
return false;
}