题目如下:

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] -= 1
break
#print dp
return sum(dp) % (pow(10,9) + 7)

最新文章

  1. WEB前端html基础中的各类标签介绍
  2. 准备再次开始更新文章,做了10年.net,有项目需要转java
  3. js实现快速排序
  4. npm下载包时代理配置
  5. Android 中pid与uid的作用与区别
  6. 最大ASCII的和问题
  7. CodeForces 478B 第八次比赛 B题
  8. ./configure --prefix=
  9. Google与微软为jQuery等类库提供的CDN服务
  10. LINUX用户管理——/etc/passwd文件详解
  11. php7 install memcache extension
  12. jsp中使用java函数
  13. 使用EF扩展EntityFramework.BulkInsert实现批量插入
  14. OminiMarkupPreview快捷键
  15. 【JDK1.8】JUC——AbstractQueuedSynchronizer
  16. 附录D——自动微分(Autodiff)
  17. AngularJS基于MVC的复杂操作案例
  18. Kaggle:House Prices: Advanced Regression Techniques 数据预处理
  19. VBA读取、增加自定义和修改文档属性
  20. 官方资料&一些好的博客与技术点

热门文章

  1. The main Method
  2. 【leetcode】1021. Best Sightseeing Pair
  3. 数据挖掘:周期性分析SMCA算法
  4. CLLocationManager在多线程下使用
  5. python input() 与raw_input()
  6. 开源 NAS 操作系统不完全汇总
  7. Nginx+Tomcat Session 无效问题
  8. 10. Jmeter-后置处理器一
  9. Digital Root 的推导
  10. 什么是Spring Boot?