leetcode 交错字符串 中等
dp,一开始想成了三维dp,dp[i][j][k] 表示 s3 前 i 个是否能由 s1 前 j 个和 s2 前 k 个构成,
最后其实是第一维不需要,直接 dp[i][j] 表示 s1 前 i 个和 s2 前 j 个是否能够构成 s3 前 i + j 个即可。
转移方程:dp[i][j] = (dp[i - 1][j] & s1[i] == s3[p]) | (dp[i][j - 1] & s2[j] == s3[p]).
最后实际上需要对 i 做偏移量避免越界,偏移量可以放在 dp 数组上,也可以放在 字符串上.
class Solution { public: bool isInterleave(const string &s1, const string &s2, const string &s3) { // dp[i][j] 表示 s1 的前 i 个, s2 的前 j 个是否能构成 s3 的前 i + j 个 if(s1.size() + s2.size() != s3.size()) return false; vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1, false)); dp[0][0] = true; for(int i = 0; i <= s1.size(); ++ i) { for(int j = 0; j <= s2.size(); ++ j) { int p = i + j - 1; if(i > 0) dp[i][j] = dp[i - 1][j] & (s1[i - 1] == s3[p]); if(j > 0) dp[i][j] = dp[i][j] | dp[i][j - 1] & (s2[j - 1] == s3[p]); } } return dp.back().back(); } };