Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
Example 1:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" Output: true
Example 2:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" Output: false
/* 判断s3 能否由s1 s2交替形成 即字符串内部的相对顺序不能变
* dp[i][j]表示s[i+j-1] 能否由s1[i-1] s2[j-1]构成
* 显然 dp[i][j] 要么由dp[i][j-1]true转移来(s2[j-1]=s3[i+j-1]) 要么由dp[i-1][j]&&s1[i-1]=s3[i+j-1]转移来
* 边际情况
* 当i=0 或者j=0 表示s1 或着s2 为空 那么只要考虑一半条件 即dp[0][j]=dp[0][j-1] && s2[j-1]=s3[j-1]
* 所以dp[0][0]=true 才能使得dp[0][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;
vector<vector<bool>> dp(len1+1, vector<bool>(len2+1, false));
for(int i=0;i<=len1;i++){
for(int j=0;j<=len2;j++){
if(i==0 && j==0) dp[i][j]=true;
else if(i==0) dp[0][j]=dp[0][j-1] && s2[j-1]==s3[j-1];
else if(j==0) dp[i][0]=dp[i-1][0] && s1[i-1]==s3[i-1];
else dp[i][j]=(dp[i][j-1]&&s2[j-1]==s3[i+j-1]) || (dp[i-1][j]&&s1[i-1]==s3[i+j-1]);
}
}
return dp[len1][len2];
}
};