joshua分享:动态规划解法,入门级别解法

distinct-subsequences

http://www.nowcoder.com/questionTerminal/ed2923e49d3d495f8321aa46ade9f873

状态转移方程:dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
还可以继续优化,可以用空间换时间,减少求解dp[i][j]的查询数量,
贴出代码,请大佬给出更优的算法,以此共勉!

class Solution {
public:
    int numDistinct(string S, string T) {
        int ans = 0, n = S.size(), m = T.size();
        vector<vector<int> > dp(m, vector<int>(n, 0));

        // S是主串,T是匹配串
        // 初始化,匹配串的第一个字符在主串中出现的位置
        for(int j = 0; j < n; j++) {
            if(T[0] == S[j]) dp[0][j] = 1;
        }
        // 
        for(int i = 1; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(T[i] == S[j]) {
                    // 状态转移方程,当前的结果数为上一行所有遇到的情况的加和
                    // 即: dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
                    for(int leftJ = j-1; leftJ >= 0; leftJ--) {
                        dp[i][j] += dp[i-1][leftJ];
                    }
                }
            }
        }
        // 匹配总数是最后一个匹配字符在主串中分别出现的位置的总数加和
        for(int j = 0; j < n; j++) 
            ans += dp[m-1][j];
        return ans;
    }
};
全部评论

相关推荐

仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务