LeetCode 97

https://leetcode.cn/problems/interleaving-string/description/

难度:中等

高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/

f[i + 1][j + 1] 表示 s3 的前 i + j + 2 个元素能否由 s1 的前 i + 1 个元素和 s2 的前 j + 1 个元素组成。

状态转移条件是 s3 的前 i + j + 1 个元素能否由 s1 的前 i 个元素和 s2 的前 j + 1 个元素组成,或由 s1 的前 i + 1 个元素和 s2 的前 j 个元素组成。

初始值 f[0][0] = 0,并且单独计算 f[i][0] 和 f[0][j]。

时间复杂度:O(nm)。

空间复杂度:O(nm)。

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int n = s1.size(), m = s2.size();
        if (n + m != s3.size()) {
            return false;
        }

        vector f(n + 1, vector<int>(m + 1));
        f[0][0] = true;
        for (int j = 0; j < m; j++) {
            f[0][j + 1] = s2[j] == s3[j] && f[0][j];
        }
        for (int i = 0; i < n; i++) {
            f[i + 1][0] = s1[i] == s3[i] && f[i][0];
            for (int j = 0; j < m; j++) {
                f[i + 1][j + 1] = s1[i] == s3[i + j + 1] && f[i][j + 1] ||
                                  s2[j] == s3[i + j + 1] && f[i + 1][j];
            }
        }
        return f[n][m];
    }
};