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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if(len3 != len1 + len2) return false;
if(len1 == 0) return (s2==s3);
if(len2 == 0) return (s1==s3);
vector<bool> vec(len1+1,0);
vector<vector<bool>> matrix(len2+1,vec);
matrix[0][0] = 1;
for(int i = 0;i < len1;i++)
{
if(s1[i] == s3[i]) matrix[0][i+1] = 1;
else break;
}
for(int i = 0;i < len2;i++)
{
if(s2[i] == s3[i]) matrix[i+1][0] = 1;
else break;
}
for(int i = 1; i <= len2;i++)
{
for(int j = 1;j <= len1;j++)
{
if(matrix[i][j-1] && s3[i+j-1] == s1[j-1] ||
matrix[i-1][j] && s3[i+j-1] == s2[i-1]){
matrix[i][j] = 1;
}
}
}
return matrix[len2][len1];
}
};
20 milli secs.