940. 不同的子序列 II

2024-02-12 13:12
文章标签 ii 序列 不同 940

本文主要是介绍940. 不同的子序列 II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 940. 不同的子序列 II

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一道动态规划的题目。我们需要找出字符串中所有的不同子序列的数量。子序列是从原始序列中删除一些(或不删除)元素但不改变剩余元素的顺序形成的新序列。例如,“ace” 是 “abcde” 的一个子序列,但 “aec” 不是。

我们可以使用一个数组 cnt 来记录每个字符最后一次出现的位置。然后,我们遍历字符串,对于每个字符,我们都有两种选择:将其添加到当前的子序列中,或者不添加。如果我们选择添加,那么新的子序列的数量就是当前的子序列的数量的两倍(因为我们可以选择添加或者不添加这个字符到每一个已经存在的子序列中)。但是,这样会导致重复计算那些包含当前字符的子序列,所以我们需要减去这部分的数量,这部分的数量就是在当前字符上一次出现的位置时的子序列的数量。

解题方法

我们首先初始化一个数组 cnt 来记录每个字符最后一次出现的位置,以及一个变量 all 来记录当前的子序列的数量。然后,我们遍历字符串,对于每个字符,我们计算新添加的子序列的数量 newAdd,这个数量等于当前的子序列的数量减去这个字符上一次出现的位置的子序列的数量。然后,我们更新这个字符在 cnt 中的数量,以及 all 的值。最后,我们返回 all - 1,因为我们需要排除空的子序列。

复杂度

时间复杂度:

O ( n ) O(n) O(n),其中 n n n 是字符串的长度。我们需要遍历一次字符串。

空间复杂度:

O ( 1 ) O(1) O(1),我们只需要常数的空间来存储 cnt 和 all。

Code

class Solution {public int distinctSubseqII(String s) {int mod = 1000000007;char[] str = s.toCharArray();int[] cnt = new int[26];int all = 1, newAdd;for(char c : str) {newAdd = (all - cnt[c - 'a'] + mod) % mod;cnt[c - 'a'] = (cnt[c - 'a'] + newAdd) % mod;all = (all + newAdd) % mod;}return (all - 1 + mod) % mod;}
}

这篇关于940. 不同的子序列 II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702648

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u