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.
//此题用DP解决!感觉比较经典!对于f[][]的大小申请,一般为f[len1+1][len2+1],因为f[0][0]常用于启动该算法的值为true!!
//次类题返回由于是递推,返回值常为f[len1][len2]。
// 此题思路很清晰,有 s3[i+j] = s1[i] + s2[j];
// 故而转化为:需一个f[i][j]的空间存状态,表示匹配
// 用状态转移方程:
// f[i][j] = { f[i-1][j]&&(s1[i-1] == s3[i+j-1]) || f[i][j-1]&&(s2[j-1] == s3[i+j-1])}
//
bool isInterleave(string s1, string s2, string s3) {
int len1,len2,len3;
int i,j;
len1 = s1.size();
len2 = s2.size();
len3 = s3.size();
bool f[len1+1][len2+1];
if(len1+len2 != len3) return false;
memset(f,false,sizeof(bool)*len1*len2);
f[0][0] = true;//空字符串
//初始条件 ---即获取 f[i][0]的情况。即刚开始s1能匹配的字符
for(i = 1; i <= len1; i++)
{
if(!(f[i][0] = (s1[i-1] == s3[i-1]&&f[i-1][0])) )
break;//一遇到不匹配则跳出
}
//---即获取 f[j][0]的情况。即刚开始s2能匹配的字符
for(j = 1; j <= len2; j++)
{
if(!(f[0][j] = (s2[j-1] == s3[j-1]&&f[0][j-1])) )
break;//一遇到不匹配则跳出
}
for(i = 1; i <= len1; i++)
for(j = 1; j <= len2; j++)
{
f[i][j] = (f[i-1][j]&&(s1[i-1] == s3[i+j-1]) || f[i][j-1]&&(s2[j-1] == s3[i+j-1]));
}
return f[len1][len2];
}