Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving ofs1 ands2.
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(s3.size() != (s1.size() + s2.size()))
return false;
vector<vector<bool> > matrix(s1.size() + 1, vector<bool>(s2.size() + 1));
matrix[0][0] = true;
for(int i = 1; i <= s1.size(); ++i)
matrix[i][0] = matrix[i-1][0] && s1.at(i-1) == s3.at(i-1);
for(int i = 1; i <= s2.size(); ++i)
matrix[0][i] = matrix[0][i-1] && s2.at(i-1) == s3.at(i-1);
for(int i = 1; i <= s1.size(); ++i)
{
for(int j = 1; j <= s2.size(); ++j)
{
if(matrix[i-1][j] && s1.at(i-1) == s3.at(i+j-1))
matrix[i][j] = true;
else if(matrix[i][j-1] && s2.at(j-1) == s3.at(i+j-1))
matrix[i][j] = true;
else if(matrix[i-1][j-1])
{
if(s1.at(i-1) == s3.at(i+j-2) && s2.at(j-1) == s3.at(i+j-1))
matrix[i][j] = true;
else if(s2.at(j-1) == s3.at(i+j-2) && s1.at(i-1) == s3.at(i+j-1))
matrix[i][j] = true;
}
else
matrix[i][j] = false;
}
}
return matrix[s1.size()][s2.size()];
}
};
把上面的代码整理一下!
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s3.size() != (s1.size() + s2.size()))
return false;
vector<vector<bool> > matrix(s1.size() + 1, vector<bool>(s2.size() + 1));
matrix[0][0] = true;
for(int i = 1; i <= s1.size(); ++i)
matrix[i][0] = matrix[i-1][0] && s1.at(i-1) == s3.at(i-1);
for(int i = 1; i <= s2.size(); ++i)
matrix[0][i] = matrix[0][i-1] && s2.at(i-1) == s3.at(i-1);
for(int i = 1; i <= s1.size(); ++i)
{
for(int j = 1; j <= s2.size(); ++j)
{
matrix[i][j] = (matrix[i-1][j] && s1.at(i-1) == s3.at(i+j-1))
|| (matrix[i][j-1] && s2.at(j-1) == s3.at(i+j-1))
|| (matrix[i-1][j-1]) &&
(s1.at(i-1) == s3.at(i+j-2) && s2.at(j-1) == s3.at(i+j-1))
|| (matrix[i-1][j-1]) &&
(s2.at(j-1) == s3.at(i+j-2) && s1.at(i-1) == s3.at(i+j-1));
}
}
return matrix[s1.size()][s2.size()];
}
};
上次写的搜索版本的。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
vector<vector<int> > matrix(s1.size());
for(int i = 0; i < s1.size(); ++i)
{
matrix[i].resize(s2.size());
for(int j = 0; j < s2.size(); ++j)
matrix[i][j] = 0;
}
return isInter(s1.c_str(), 0, s2.c_str(), 0, s3.c_str(), 0, matrix);
}
bool isInter(const char* s1, int i1, const char* s2, int i2, const char* s3, int i3, vector<vector<int> >& matrix)
{
if(0 == *s1)
{
while(0 != *s2 && *s2 == *s3)
{
++s2;
++s3;
}
if(0 == *s2 && 0 == *s3)
return true;
else
return false;
}
if(0 == *s2)
{
while(0 != *s1 && *s1 == *s3)
{
++s1;
++s3;
}
if(0 == *s1 && 0 == *s3)
return true;
else
return false;
}
if(1 == matrix[i1][i2])
return false;
if(*s1 == *s3)
{
if(isInter(s1 + 1, i1 + 1, s2, i2, s3 + 1, i3 + 1, matrix))
return true;
}
if(*s2 == *s3)
{
if(isInter(s1, i1, s2 + 1, i2 + 1, s3 + 1, i3 + 1, matrix))
return true;
}
matrix[i1][i2] = 1;
return false;
}
};