【题目】
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.
【思路】
设S(i)表示长度为i的S3序列是否为S1和S2的交叉队列,D(i + 1)表示S3序列新添加的字符是否等于S1或S2序列新添加的字符,S(i + 1)= S(i) && D(i + 1)。可以得出这是一个动态规划问题,除此之外该问题存在回溯,因此我们用备忘录方法进行解决。设table[i][j]表示S3是否为长度为i的S1和长度为2的S2的交叉队列,得到状态转换方程:
table[i][j] = (table[i][j- 1] && D(i + j)) || (table[i- 1][j] && D(i + j));
【c++代码】
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int i = 0, j = 0;
bool table[s1.length() + 1][s2.length() + 1];
if (s3.length() == s1.length() + s2.length())
{
for (; i <= s1.length(); i++)
{
for (j = 0; j <= s2.length(); j++)
{
if (i == 0 && j == 0)
{
table[i][j] = true;
} else if (i == 0)
{
table[0][j] = table[0][j- 1] && (s3[j- 1] == s2[j - 1]);
} else if (j== 0)
{
table[i][0] = table[i- 1][0] && (s3[i - 1] == s1[i - 1]);
} else
{
table[i][j] = (table[i][j - 1] && (s3[i + j - 1] == s2[j - 1])) ||
(table[i - 1][j] && (s3[i + j - 1] == s1[i - 1]));
}
}
}
}
return table[s1.length()][s2.length()];
}
};