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.
f(i, j) = ( f(i-1, j) , if a[i] = s[i+j] ) || (f(i, j-1), if b[j] = s[i+j] )
这里需要注意的是下标问题,当i=0或j=0时,表示的是空字符串。当两个都是空字符串的时候,我们认为是interleaving的,返回true
否则当其中一方为空字符串时,要逐位求得f(i, j)的值,因为后面的计算需要用到。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n = s1.length(), m = s2.length(), len = s3.length();
if (m + n != len) return false;
vector<bool> dp(m + 1, false);
dp[0] = true;
for (int j = 1; j <= m; j++)
dp[j] = (dp[j - 1] && s2[j - 1] == s3[j - 1]);
for (int i = 1; i <= n; i++) // 0 means empty string
{
dp[0] = (dp[0] && s1[i - 1] == s3[i - 1]);
for (int j = 1; j <= m; j++)
dp[j] = (dp[j - 1] && s2[j - 1] == s3[i + j - 1]) || (dp[j] && s1[i - 1] == s3[i + j - 1]);
}
return dp[m];
}
};