Given a string S and a string T, count the number of distinct subsequences of T in S. (Hard)

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

分析:

看题目感觉就跟LCS很像,考虑用双序列动态规划解决。

1. 状态:

dp[i][j]表示从第一个字符串前i个组成的子串转换为第二个字符串前j个组成的子串共有多少种方案。

2. 递推:

s[i - 1] == t[j - 1], 则dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

s[i - 1] != t[j - 1],则dp[i][j] = dp[i - 1][j];

3. 初始化:

dp[i][0] = 1(删除到没有字符只有一种方案)

4. 返回值:

dp[sz1 - 1][sz2 - 1]

代码:

 class Solution {
public:
int numDistinct(string s, string t) {
int sz1 = s.size(), sz2 = t.size();
int dp[sz1 + ][sz2 + ];
memset(dp, , sizeof(dp));
for (int i = ; i < sz1; ++i) {
dp[i][] = ;
}
for (int i = ; i <= sz1; ++i) {
for (int j = ; j <= sz2; ++j) {
if (s[i - ] == t[j - ]) {
dp[i][j] = dp[i - ][j - ] + dp[i - ][j];
}
else {
dp[i][j] = dp[i - ][j];
}
}
}
return dp[sz1][sz2];
}
};

最新文章

  1. 一起来做chrome扩展《可配置的代理》
  2. git和svn
  3. android launchmode(四种启动模式)应用场景及实例
  4. 很好的一篇讲LTP在编解码中的作用的文章
  5. .net 中 ref out params的区别
  6. PHP中的XML解析的5种方法
  7. Java运行环境的配置(JDK和JRE)
  8. 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
  9. tomcat7 https 成功测试
  10. HTML5音乐可视化
  11. 透过浏览器看HTTP缓存(转)
  12. tyflow birth节点
  13. 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
  14. Selenium自动化测试之学会元素定位
  15. Windows10下安装VMware虚拟机并搭建CentOS系统环境
  16. 每日一小时linux(1)--sysRq
  17. Android高效内存2:让图片占用尽可能少的内存
  18. ImageMagick安装
  19. java中new一个对象和对象=null有什么区别
  20. const关键字对C++成员函数的修饰

热门文章

  1. Wamp PHP 安装各种拓展
  2. H5C3--边框阴影box-shadow
  3. JS 重载页面,本地刷新,返回上一页
  4. LR自带网站飞机订票系统 启动
  5. 操作系统 Lab1
  6. case 和decode的区别
  7. Oracle时间一串数字转为日期格式
  8. day36 07-Hibernate抓取策略:many-to-one上的抓取策略
  9. python之pip
  10. C++函数部分总结