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,设立一个数组dp[0][0],dp[i][j],表示的是s3能被长度为i的s1和长度为j的s2交替迭代组成,那么当s3[i+j-1]=s1[i-1]的时候dp[i][j]=dp[i-1][j],当s3[i+j-1]=s2[j-1]的时候dp[i][j]=dp[i][j-1]
代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1=s1.size(),len2=s2.size(),len3=s3.size();
if(len1+len2!=len3) return false;
if(s1+s2==s3) return true;
bool dp[1000][1000];
dp[0][0]=true;
for(int i=1;i<=len1;i++){
dp[i][0]=(dp[i-1][0] && s3[i-1]==s1[i-1]);
}
for(int j=1;j<=len2;j++){
dp[0][j]=(dp[0][j-1] && s3[j-1]==s2[j-1]);
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
dp[i][j]=(dp[i-1][j] && s1[i-1]==s3[i+j-1]) || (dp[i][j-1] && s2[j-1]==s3[i+j-1]);
}
}
return dp[len1][len2];
}
};