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.
//p[i][j] = s1[i-1] == s3[i+j-1]&&p[i-1][j] == true || s1[j-1] == s3[i+j-1]&&p[i][j-1] == true
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
vector<vector<bool> > bflag(s1.size() + 1, vector<bool>(s2.size() + 1, false));
bflag[0][0] = true;
for (int i=1;i<=s1.size();i++)
{
if (bflag[i-1][0] && s1[i-1] == s3[i-1])
bflag[i][0] = true;
else
break;
}
for (int i=1;i<=s2.size();i++)
{
if (bflag[0][i-1] && s2[i-1] == s3[i-1])
bflag[0][i] = true;
else
break;
}
for (int i=1;i<=s1.size();i++)
{
for (int j=1;j<=s2.size();j++)
{
bflag[i][j] = (s1[i-1] == s3[i+j-1]&&bflag[i-1][j]) || (s2[j-1] == s3[i+j-1]&&bflag[i][j-1]);
}
}
return bflag[s1.size()][s2.size()];
}
};
//优化空间 只用一行
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
vector<bool> bflag(s2.size() + 1, false);
bflag[0] = true;
for (int i=0;i<=s1.size();i++)
{
if (i>0)
bflag[0] = bflag[0] && s1[i-1] == s3[i-1];
for (int j=1;j<=s2.size();j++)
{
bflag[j] = (s1[i-1] == s3[i+j-1]&&bflag[j]) || (s2[j-1] == s3[i+j-1]&&bflag[j-1]);
}
}
return bflag[s2.size()];
}
};
//还可以dfs配合保存结果
测试
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution1 {
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() == 0 && s2.size() == 0)
return s3.size() == 0;
if (s1.size() + s2.size() != s3.size())
return false;
vector<vector<bool> > bflag(s1.size() + 1, vector<bool>(s2.size() + 1, false));
bflag[0][0] = true;
for (int i=1;i<=s1.size();i++)
{
if (bflag[i-1][0] && s1[i-1] == s3[i-1])
bflag[i][0] = true;
else
break;
}
for (int i=1;i<=s2.size();i++)
{
if (bflag[0][i-1] && s2[i-1] == s3[i-1])
bflag[0][i] = true;
else
break;
}
for (int i=1;i<=s1.size();i++)
{
for (int j=1;j<=s2.size();j++)
{
bflag[i][j] = (s1[i-1] == s3[i+j-1]&&bflag[i-1][j]) || (s2[j-1] == s3[i+j-1]&&bflag[i][j-1]);
}
}
/*
for (int i=0;i<=s1.size();i++)
{
for (int j=0;j<=s2.size();j++)
{
if (bflag[i][j])
cout<< " true ";
else
cout<<" FALSE ";
}
cout<<endl;
}*/
return bflag[s1.size()][s2.size()];
}
};
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() == 0 && s2.size() == 0)
return s3.size() == 0;
if (s1.size() + s2.size() != s3.size())
return false;
vector<bool> bflag(s2.size() + 1, false);
bflag[0] = true;
for (int i=0;i<=s1.size();i++)
{
if (i>0)
bflag[0] = bflag[0] && s1[i-1] == s3[i-1];
for (int j=1;j<=s2.size();j++)
{
bflag[j] = (s1[i-1] == s3[i+j-1]&&bflag[j]) || (s2[j-1] == s3[i+j-1]&&bflag[j-1]);
}
}
return bflag[s2.size()];
}
};
int main()
{
Solution s;
string s1 ="aabcc";
string s2 ="dbbca";
string s3 ="aadbbbaccc";
if (s.isInterleave(s1,s2,s3))
cout<<"true"<<endl;
else
cout<<"FALSE"<<endl;
}