leetcode 困难 —— 不同的子序列(dp)

news/2024/7/5 6:04:51

题目:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
题目数据保证答案符合 32 位带符号整数范围。

题解:
又是字符串相关 dp(字符串类型题目,经常用 dp)
dp[i][j] 为 字符串 t 的 0 到 i 的 子串,在 字符串 s 的 0 到 j 的子串 中出现的次数(老经典了)

如果 t[i][j] == s[i][j]
则 dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1]
说明匹配的次数要加上 dp[i - 1][j - 1],即字符串 s 的 0 到 j - 1 的子串中出现 字符串 t 的 0 到 i - 1 的子串
(即加上以 字符串 s 的第 j 个为末尾匹配上的次数)

如果 t[i][j] != s[i][j]
则 dp[i][j] = dp[i][j - 1]
说明匹配的次数没有增加

最后压缩一下 dp 的数组
因为只用到了 i - 1,所以成 2 维即可
(压缩后如果结果出现问题,大概率是因为 i - 2,i - 3 … 等以前的状态混到 i - 1 状态了,清除影响就行)

代码如下

class Solution {
public:
    unsigned int dp[2][1005] = {0};
    int numDistinct(string s, string t) {
        for(int j = 0; j < s.size(); j++) {
            dp[0][j] = 1;
        }
        for(int i = 1; i <= t.size(); i++) {
            for(int j = 0; j < i; j++) {
                dp[i % 2][j] = 0;
            }
            for(int j = i; j <= s.size(); j++) {
                if(t[i - 1] == s[j - 1]) dp[i % 2][j] = (dp[i % 2][j - 1] + dp[(i - 1) % 2][j - 1]) % INT_MAX;
                else {
                    dp[i % 2][j] = dp[i % 2][j - 1];
                }
            }
        }
        return (int)dp[t.size() % 2][s.size()];
    }
};

http://lihuaxi.xjx100.cn/news/980179.html

相关文章

JavaScript随机数

概念总结 js产生随机数通常是使用javascript的Math.random()函数 常用的几种方法&#xff1a;Math.random()表示:结果为0-1之间&#xff08;包括0,不包括1&#xff09;&#xff1b; Math.floor(Math.random()*101)表示结果为1-10之间的一个随机数 Math.floor(Math.random()…

Application工具方法

//注册这个接口registerActivityLifecycleCallbacks(activityLifecycleCallbacks);}Overridepublic void onTerminate() {//注销这个接口。unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);super.onTerminate();}public static List<Activity> activi…

剑指offer JZ6 从尾到头打印链表

Java 剑指offer JZ6 从尾到头打印链表 文章目录Java 剑指offer JZ6 从尾到头打印链表一、题目描述二、递归写法三、栈方法使用Java的递归和栈解决从尾到头打印链表的问题 一、题目描述 输入一个链表的头节点&#xff0c;按链表从尾到头的顺序返回每个节点的值&#xff08;用数组…

如何正确努力?7 分钟重新认识冰山模型。

我明明很努力&#xff0c;但好像没什么卵用&#xff1f;”这是很多职场人士或者即将进入职场的人容易产生的困惑。美国著名社会心理学家麦克利兰在 1973 年所提出的素质冰山模型大概能解释这种情况。不过&#xff0c;让我们先从【冰山一角】这个词开始。当你听到它&#xff0c;…

k8s 部署 skywalking 并持久化到es

1、k8s中安装部署 skywalking skywalking集群情况下需要保证用同一数据源&#xff0c;这里我们存储方式改为es 1.1 部署elasticsearch docker run -it -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node"…

nginx配置维护页面的方法

一、描述 本人公司一般发版是不停项目的&#xff0c;但是遇到特殊情况、就不得不停项目发版&#xff0c;用户就会有几个小时不能使用。 停项目发版时&#xff0c;会修改下nginx&#xff0c;让所有请求都跳转到维护页面&#xff0c;在此记录下修改方法。 二、nginx配置维护页…

扩展欧几里得算法及其应用

前言 由于数论的板子真的很抽象&#xff0c;也很难背&#xff0c;所以特此记录扩展欧几里得算法的板子和它的用途 本篇文章只涉及应用&#xff0c;不涉及证明&#xff0c;如需理解证明还请各位移步其他优秀的讲解&#xff01; 扩展欧几里得算法 先粘一下板子的代码 typedef lo…

每天5分钟快速玩转机器学习:贝叶斯算法的局限性

本文重点 贝叶斯算法的应用很广泛,其中最经典的应用就是垃圾邮件的分类,本节课程通过垃圾邮件的例子来看一下贝叶斯算法存在的一些问题,我们应该如何解决它? 垃圾邮件分类 给定一封电子邮件,我们如何判断这封电子邮件是垃圾邮件还是正常邮件,这是机器学习中的二分类问…