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]代表着当字符串1长度为i,字符串2长度为j,字符串3长度为i+j时,串3是否为1和2的Interleaving String。
显然f[0][0]为边界条件,为true,即都为空串的话,为true。
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n1 = s1.size();
int n2 = s2.size();
if(n1+n2 != s3.size()) return false;
vector<vector<bool> > f(n1+1, vector<bool>(n2+1, false));
f[0][0] = true;
for(int i = 0; i <= n1; ++i)
{
for(int j = 0; j <= n2; ++j)
{
/* 判断f[i][j],f[i][j]可能由 f[i-1][j]或f[i][j-1]决定*/
int len = i+j;if(i >= 1 && s1[i-1] == s3[len-1]) //当串1当前字符与串3当前字符相同时
f[i][j] = f[i][j] || f[i-1][j];
if(j >= 1 && s2[j-1] == s3[len-1])//当串2当前字符与串3当前字符相同时
f[i][j] = f[i][j] || f[i][j-1];
}
}
return f[n1][n2];
}
};