题目描述


给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。例如,"ace" 是 "abcde" 的一个子序列,但 "aec" 不是。

数据样例&给定要求

示例 1:输入:s = "abc"
输出:7
解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。示例 2:输入:s = "aba"
输出:6
解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。示例 3:输入:s = "aaa"
输出:3
解释:3 个不同的子序列分别是 "a", "aa" 以及 "aaa"。提示:1 <= s.length <= 2000
s 仅由小写英文字母组成

题目思路

  1. 这是一道动态规划类型的题目
  2. 子序列问题我们要从以每一个位置作为结尾来进行考虑
  3. 子序列问题每一个位置我们做出俩个决策,选或者不选
  4. 最后子序列的结果就是以每一个字符结尾的所有子序列结果的累加和
  5. 共有26个小写字母,记录以每一个小写字母结尾形成子序列的个数,但是我们可能会出现重复的字母,所以我们通过数组来记录每个字母上一次出现的下标位置,然后求得以当前字母结尾的子序列个数,将所有的结果进行累加求得,最后取模

题目代码

方法一:

class Solution {final int mod=1000000007;public int distinctSubseqII(String s) {char c[]=s.toCharArray();long count[]=new long[26];for(int i=0;i<c.length;i++){int a=c[i]-'a';for(int j=0;j<26;j++){if(j!=a){count[a]+=count[j];}}count[a]=(count[a]+1)%mod;}long ans=0;for(int i=0;i<26;i++){ans+=count[i];}return (int)(ans%mod);}
}

方法二:

class Solution {final int mod=1000000007;public int distinctSubseqII(String s) {int n=s.length();int[] res=new int[n];int[] arr=new int[26];Arrays.fill(res,1);Arrays.fill(arr,-1);for(int i=0;i<n;i++){int index=s.charAt(i)-'a';for(int j=0;j<26;j++){if(arr[j]>=0){res[i]=(res[i]+res[arr[j]])%mod;}}arr[index]=i;}int sum=0;for(int i=0;i<26;i++){if(arr[i]>=0){sum=(sum+res[arr[i]])%mod;}}return sum%mod;}
}

【不同的子序列II】相关推荐

  1. lintcode 最长上升连续子序列 II(二维最长上升连续序列)

    题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...

  2. 华为机试-字符串子序列II

    华为机试-字符串子序列II 1.思路 2.代码 1.思路 理解这个抽象题目,其实就是一个求最长子序列的题目.求最长子序列我们一般使用动态规划来做. 与以往不同的是,我们需要倒序求最长子序列,这样可以求 ...

  3. (贪心+最长上升子序列) acwing 896. 最长上升子序列 II

    896. 最长上升子序列 II 题目链接https://www.acwing.com/problem/content/898/ 题目: 思路:在队列里求出小于t的最大的一个数的下标.a[0]初始化最小 ...

  4. LeetCode 940. 不同的子序列 II(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 S,计算 S 的不同非空子序列的个数. 因为结果可能很大,所以返回答案模 10^9 + 7. 示例 1: 输入:"abc&quo ...

  5. AcWing 896. 最长上升子序列 II(二分优化LIS)

    题目连接 https://www.acwing.com/problem/content/description/898/ 思路 我们用一个f[i]f[i]f[i]表示以长度为i结尾的子序列的最小值的大 ...

  6. 2022华为机试真题 C++ 实现 【字符串子序列II】

    目录 题目 思路 核心考点 Code 题目 给定字符串 target 和 source,判断 target是否为 source 的子序列.你可以认为target和 source 中仅包含英文小写字母. ...

  7. 896. 最长上升子序列 II

    给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 NN. 第二行包含 NN 个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 ...

  8. 最长上升子序列(LIS) nlogn解法

    文章目录 经典DP解法O(n^2) dp+二分法(O(nlogn)) 最长上升子序列LIS:Longest increasing subsequence 题目链接:Leetcode300. 最长递增子 ...

  9. 动态规划之子序列问题

    文章目录 一.最长递增子序列I 二. 最长递增子序列II 二.数字和最大的递增子序列 三.连续子数组最大和 四.最长公共子序列 一.最长递增子序列I 题目描述 给定一个长度为N的数列,求数值严格单调递 ...

最新文章

  1. 【c语言|Python】求一元二次方程ax^2+bx+c=0的根
  2. c/c++程序员的技术栈
  3. python创建sqlite3数据库_Python之Sqlite3数据库基本操作
  4. 一篇文章带你分清楚JWT,JWS与JWE
  5. c语言中二重指针如何赋值,关于二重指针释放的有关问题
  6. c 应用程序开发框架_企业应用程序开发框架的分类
  7. 【专栏必读】王道考研408数据结构万字笔记(有了它不需要你再做笔记了):各章节内容概述导航和思维导图
  8. 远洋渔船一次出海好几年,生活枯燥,那你在船上最开心的事是啥?
  9. Jmeter 2.6下载安装
  10. RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用
  11. 实现单片机通过传感器获取信息,并且将信息通过wifi模块发送信息给PC端,并在pyqt5界面上显示(PC端部分)
  12. 怎么免费获取帆软9.0激活码,帆软8.0激活码,如何激活
  13. 10.26 要尝试让自己安静下来,去做该做的事 而不是让内心烦躁,焦虑,毁掉你本就不多的热情和定力
  14. 【雅虎2017】一个在线展示广告的CVR预估框架实践
  15. Transformer + RL:是强化学习魔高一尺,还是 Transformer 道高一丈? (1)
  16. 【原理】Basic Integer Overflows
  17. 单片机:延时函数的理解
  18. Centos开机后ens33网卡失效连不上网
  19. 进程互斥以及进程互斥实现方法(包含代码)
  20. IF: 8+ 基于单细胞 RNA-seq 构建非小细胞肺癌免疫反应的中性粒细胞预后模型

热门文章

  1. TRS_WCM(拓尔思信息技术有限公司)内容协作平台平台置标经验攻略
  2. Animation动画效果
  3. vim资源很全的一个网站
  4. 三年又三年,我朋友都生娃了《打工人的故事》
  5. Python 命令行编程
  6. 当BiocManager废了
  7. SAP GUI Dracula Theme 主题
  8. table表头和首列的表格固定-CSS实现的Table表头固定
  9. 一些关于dagger2的理解
  10. Java使用POI获取Excel公式