题目:给定三个串str1,str2,str3,判断str3是否是str1,str2的交叉字符串。
交叉字符串:两个字符串的字符交叉,组成新的字符串,要求属于原来字符串中的字符在新的生成的交叉字符串中的顺序与原顺序相同。即若a、b在源字符串中时a在前面,那么在新的字串中时,a也的在b的前面。
回想问题Distinct Subsequences,其形式表示为 S --通过合理的规则----得到 T 的方法数。
本题套用这种模式就是:str1,str2 ---通过合理的规则---得到str3的方法数。当方法数大于等于1的时候,我们返回true,为0时返回false。
bool isInterleave(string s1, string s2, string s3) {
if(0 == s1.size() && 0 == s2.size() && 0 == s3.size())
return true;
if(s1.size() + s2.size() != s3.size())
return false;
int len1 = s1.size();
int len2 = s2.size();
int len3 = s3.size();
//vector<vector<bool> > dp(len1 + 1, vector<bool>(len2 + 1, false));
vector<vector<int> > dp(len1 + 1, vector<int>(len2 + 1, 0));
//initial
//dp[0][0] = true;
dp[0][0] = 1;
for (int i = 1; i <= len1; ++i)
{
if(s1[i - 1] == s3[i - 1])
dp[i][0] = 1;
}
for (int j = 1; j <= len2; ++j)
{
if(s2[j - 1] == s3[j - 1])
dp[0][j] = 1;
}
for (int i = 1; i <= len1; ++i)
for (int j = 1; j <= len2; ++j)
{
if(s1[i - 1] == s3[i + j - 1] && s2[j - 1] == s3[i + j - 1])
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
//dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
else if(s1[i - 1] == s3[i + j - 1])
dp[i][j] = dp[i - 1][j];
else if(s2[j - 1] == s3[i + j - 1])
dp[i][j] = dp[i][j - 1];
}
return dp[len1][len2] > 0;
//return dp[len1][len2];
}