题解 | #交织子序列# DP

交织子序列

https://www.nowcoder.com/practice/3885d44d77f34f1c89dc05ac40207f5d

知识点

动态规划

思路

因为要求刚好匹配 所以len(s) + len(x)=len(t)

不满足则不可以, 所以 len(t) \leq 200

定义f[i][j] 表示t的前i个字符 是否满足能 s前i个字符和x的前i-j个字符匹配

由于 len(t) \leq 200 所以状态数最多20000个

每次状态转移, 讨论当前t中的字符和哪一个字符串的字符相匹配, 单次转移的时间复杂度为O(1)

总的时间复杂度 O(n^2)

AC Code (c++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param x string字符串 
     * @param t string字符串 
     * @return bool布尔型
     */
    bool isInterleave(string s, string x, string t) {
        int n = s.size(), m = x.size(), N = t.size();
        if (m + n != N) return false;
        vector<vector<bool>> f(N + 1, vector<bool>(n + 1, false));
        // f[i][j] t前i个字符 是否满足 s前i个字符和 和x的前i-j个字符
        f[0][0] = true;
        for (int i = 1; i <= N; i ++) {
            for (int j = 0; j <= i; j ++) {
                if (j and t[i - 1] == s[j - 1]) f[i][j] = (f[i][j] or f[i - 1][j - 1]);
                if (i - j and t[i - 1] == x[i - j - 1]) f[i][j] = (f[i][j] or f[i - 1][j]);
            }
        }
        return f[N][n];
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务