题目如下:

Given a string S, count the number of distinct, non-empty subsequences of S .

Since the result may be large, return the answer modulo 10^9 + 7.

Example 1:

Input: "abc"
Output: 7
Explanation: The 7 distinct subsequences are "a", "b", "c", "ab", "ac", "bc", and "abc".

Example 2:

Input: "aba"
Output: 6
Explanation: The 6 distinct subsequences are "a", "b", "ab", "ba", "aa" and "aba".

Example 3:

Input: "aaa"
Output: 3
Explanation: The 3 distinct subsequences are "a", "aa" and "aaa".

解题思路:记dp[i]为以S[i]元素结尾可以组成的子串的个数,很显然dp[0] = 1。显然dp[i]的前一个元素可以是dp[0] ~ dp[i-1]中的任何一个,那么应该有dp[i] = dp[0] + dp[1] +...dp[i-1]。这是对于元素没有重复的情况。假设S[j]是S[0-i]中与S[i]下标最接近的元素并且有S[i] = S[j],那么在以S[i]结尾的子串中,前一个元素是在S[0]~S[j-1]中的任何一个,都会和以S[j]结尾的子串中并且前一个元素是在S[0]~S[j-1]中的任何一个重复,因此这种情况下dp[i] = dp[j]+dp[j+1] + ... dp[i-1]。最后,返回的结果应该为sum(dp)。

代码如下:

class Solution(object):def distinctSubseqII(self, S):""":type S: str:rtype: int"""dp = [1] * len(S)for i in range(1,len(S)):for j in range(i-1,-1,-1):if S[i] != S[j]:dp[i] += dp[j]else:dp[i] += dp[j]dp[i] -= 1break#print dpreturn sum(dp) % (pow(10,9) + 7)

转载于:https://www.cnblogs.com/seyjs/p/10412749.html

【leetcode】940. Distinct Subsequences II相关推荐

  1. 【Leetcode】115. Distinct Subsequences

    又是一道DP的题目,个人感觉DP的题目比较难,主要因为:(1)DP的难点是寻找子问题,如果找到很好的子问题,那么就可以瞬间搞定.(2)通常也会带有一点backtracking的思想,有时候总是优先想到 ...

  2. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  3. 【LeetCode】House Robber I II 解题报告

    [题目] I You are a professional robber planning to rob houses along a street. Each house has a certain ...

  4. 【leetcode】Jump Game I, II 跳跃游戏一和二

    题目: Jump Game I: Given an array of non-negative integers, you are initially positioned at the first ...

  5. 【leetcode】667. Beautiful Arrangement II

    题目如下: Given two integers n and k, you need to construct a list which contains ndifferent positive in ...

  6. 【leetcode】324.摆动排序 II (四种解法,快速排序+3way-partition等,java实现)

    324. 摆动排序 II 难度中等 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1 ...

  7. 【LeetCode】1140-石子游戏II

    爱丽丝和鲍勃继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = 1. 在每个玩家的回 ...

  8. 【leetcode】45. Jump Game II 非负数组的最少跳跃步数

    1. 题目 Given an array of non-negative integers, you are initially positioned at the first index of th ...

  9. 【leetcode】910. Smallest Range II

    题目如下: 解题思路:我的思路是先找出最大值.对于数组中任意一个元素A[i]来说,如果A[i] + K 是B中的最大值,那么意味着从A[i+1]开始的元素都要减去K,即如果有A[i] + K > ...

最新文章

  1. 面试官问:线程池除了常见的4种拒绝策略,你还知道哪些?
  2. 表同步更新的问题的触发器
  3. python写彩票抓取_Python|爬取彩票数据
  4. linux怎么释放内存占用,如何将linux占用的空间释放
  5. ab压力测试工具linux,【Linux】ApacheBench(ab)压力测试工具
  6. @retention注解作用_Spring 最核心的注解,都是干货!
  7. php执行zip压缩,PHP执行zip与rar解压缩方法实现代码
  8. MFC开发IM-第二十四篇、使用 acl 库针对 C++ 对象进行序列化及反序列编程
  9. jquery mysql表格_使用jQuery设计数据表格:设计表格基类
  10. Linux lamp环境验证码无法显示
  11. OpenSSL密码库算法笔记——第3.2章 模乘与模平方
  12. kitkat(KRT16S)从hal层到app层写法
  13. MySQL2:代码小节和代码测试
  14. Few-shot transfer learning for intelligent fault diagnosis of machine(机器智能故障诊断中的小样本迁移学习)
  15. MSP430F149;一、TIMEA
  16. SSM框架实现不同用户登陆进入不同页面
  17. ceph中monitor节点基本解释与图解
  18. MIT协议是干什么的?底层原理是什么?
  19. 如何构建用户画像,给用户打“标签”?
  20. 微信里有人每天早上发的早报新闻是从哪里获取的?

热门文章

  1. win10安装NET Framework 3.5提示0x800f0906原因及解决方法
  2. 配置web监控及报警
  3. Window入侵排查
  4. JQuery学习之一:(加载函数,获取画面元素,一些简单的函数【each】【find】【focuse】【blur】)
  5. 关于Oracle数据库的SQL语句使用时的一些技巧。
  6. 关于数据库中的char与varchar
  7. 解决eclipse不会自动弹出Console控制台的问题
  8. fastclick.js解决移动端(ipad)点击事件反应慢问题
  9. 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案
  10. SpringBoot解决jpa,NoSession问题