Interleaving String
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[i][j]表示s1[i] s2[j]之前的元素可以有序组合成s3[i + j]
状态转移方程
dp[i][j] = dp[i - 1][j] && s1[i] == s3[i + j] || dp[i][j - 1] && s2[j] == s3[i + j]
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
size_t n = s1.size();
size_t m = s2.size();
size_t nm = s3.size();
if(m + n != nm) return false;
//vb[i][j]表示s1[i] s2[j] 之前的元素可以组成s3[i + j]的字符串
vector<vector<bool> > vb(n + 1, vector<bool> (m + 1, false));
vb[0][0] = true;
for(size_t k = 1; k <= m; k++){ //s2的元素是列下标
vb[0][k] = vb[0][k - 1] && s2[k - 1] == s3[k - 1];
}
for(size_t k = 1; k <= n; k++){ //s1的元素是行下标
vb[k][0] = vb[k - 1][0] && s1[k - 1] == s3[k - 1];
}
for(size_t i = 1; i <= n; i++){
for(size_t j = 1; j <= m; j++){
//s1[i] && s2[j - 1]之前的元素 当前s2[j - 1]与s3比较
//s1[i -1] && s2[j]
vb[i][j] = vb[i][j - 1] && s2[j - 1] == s3[i + j - 1]
|| vb[i - 1][j] && s1[i - 1] == s3[i + j - 1];
}
}
return vb[n][m];
}
};