Given three strings: s1, s2, s3, determine whether s3 is formed by the interleaving of s1 ands2.
Example
For s1 = "aabcc"
, s2 = "dbbca"
- When s3 =
"aadbbcbcac"
, returntrue
. - When s3 =
"aadbbbaccc"
, returnfalse
.
Challenge
思路是用dp来解决,同样可以转化为BFS或者DFS
O(n2) time or better
class Solution {
public:
/**
* Determine whether s3 is formed by interleaving of s1 and s2.
* @param s1, s2, s3: As description.
* @return: true of false.
*/
bool isInterleave(string s1, string s2, string s3) {
const int l=s1.size();
const int r=s2.size();
if (s3.size()!= l+r)
return false;
if (l==0)
return s2==s3;
if (r==0)
return s1==s3;
bool dp[l+1][r+1];
for (int i=0; i<=l;i++) {
for (int j=0; j<=r;j++) {
if (i==0 && j==0) {dp[0][0]=true; continue;}
if (i==0) {
dp[0][j]=(dp[0][j-1] && (s3[j-1]==s2[j-1]));
continue;
}
if (j==0) {
dp[i][0]=(dp[i-1][0] && (s3[i-1]==s1[i-1]));
continue;
}
dp[i][j]=(dp[i-1][j] && s3[i+j-1]==s1[i-1]) || (dp[i][j-1] && s3[i+j-1]==s2[j-1]);
}
}
return dp[l][r];
}
};