思路
因为是交错组成,所以分段上其实一定满足|n - m| <= 1;
用二维dp数组表示s1,s2组成s3的情况
dp[i][j]表示在s1中取前i位,在s2中取前j位,能否组成s3的前i+j位;
如果s1[i-1] == s3[i+j-1],则dp[i][j]可由dp[i-1][j]转移而来,对于s2同理;
注意转移的过程是或的关系,dp[i][j]从dp[i-1][j]或dp[i][j-1]转移而来均可。
代码
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n1 = s1.size(), n2 = s2.size();
if(n1 + n2 != s3.size()) return false;
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
dp[0][0] = 1;
for(int i = 0; i <= n1; i++) {
for(int j = 0; j <= n2; j++) {
if(j > 0 && s2[j-1] == s3[i+j-1]) {
dp[i][j] |= dp[i][j-1];
}
if(i > 0 && s1[i-1] == s3[i+j-1]) {
dp[i][j] |= dp[i-1][j];
}
}
}
return dp[n1][n2];
}
};