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();
    }
};

 

posted @ 2021-09-21 00:06  rookie_Acmer  阅读(16)  评论(0编辑  收藏  举报