leetcode-115-Distinct Subsequences

本文介绍了一种使用动态规划(DP)算法解决字符串匹配问题的方法,具体以MIT课程中提到的最长公共子序列(LCS)算法为基础,通过构建备忘表并寻找表元素之间的关系来解决字符串匹配问题。文中详细解释了算法背后的逻辑,包括当两个字符相等或不相等时的不同情况处理,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <string.h>
using namespace std;
/*
 蛮典型的dp,因为跟MIT的课程里的LCS算法很像,也是构建一个备忘表,
 寻找备忘表元素之间的关系,关系无法一眼看出,后来看了分析,这样理解,
 比如找的是(i,j)的次数,如果s[i]==t[j],那么有两种选法,一种是选了
 s[i],那么(i,j)的次数就是(i-1,j-1)的次数;不选s[i]的话,就是
 (i-1,j)的次数;如果s[i]!=t[j],就只有第二种选法了,也就是
 (i-1,j)的次数。如果是像MIT公开课里面说的那样,用一个二维的备忘表,
 那么就是从左上角到右下角的顺序计算就好了,比较直观,但是这样需要O(n^2)
 的空间复杂度,改进的是用一个长度为T的长度加1的一位数组代替,这样复杂度
 就只是O(n),不过注意的是这样的话虽然可以从上到下计算,但是计算每一行的
 时候要从右到左,因为当前位置的值要用到上一行的前一个位置的值,这样算到
 数组最后一个元素就是结果了。
 */
class Solution {
public:
    int numDistinct(string s, string t) {
        int len = t.length();
        int *memo = new int[len + 1];
        for (int i = 0; i < len + 1; i++) {
            memo[i] = 0;
        }
        memo[0] = 1;
        for (int i = 1; i < s.length() + 1; i++) {
            for (int j = len - 1; j >= 0; j--) {
                memo[j + 1] += s[i - 1] == t[j] ? memo[j] : 0;
            }
        }
        return memo[len];
    }
};
int main(int argc, const char * argv[]) {
    Solution s;
    cout << s.numDistinct("rabbbit", "rabbit") << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值