不同的子序列

给定一个字符串 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。

一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)

示例 1:

输入: S = "rabbbit", T = "rabbit"

输出: 3

解释:

如下图所示, 有 3 种可以从 S 中得到 "rabbit" 的方案。

(上箭头符号 ^ 表示选取的字母)

rabbbit

^^^^ ^^

rabbbit

^^ ^^^^

rabbbit

^^^ ^^^

示例 2:

输入: S = "babgbag", T = "bag"

输出: 5

解释:

如下图所示, 有 5 种可以从 S 中得到 "bag" 的方案。

(上箭头符号 ^ 表示选取的字母)

babgbag

^^ ^

babgbag

^^ ^

babgbag

^ ^^

babgbag

^ ^^

babgbag

^^^

动态规划题目。

以S ="rabbbit",T = "rabbit"为例):

dp[i][j]表示T的从0开始长度为i的子串和S的从0开始长度为j的子串的匹配的个数。

比如, dp[2][3]表示T中的ra和S中的rab的匹配情况。

(1)显然,至少有dp[i][j] = dp[i][j - 1].

比如, 因为T 中的"ra" 匹配S中的 "ra", 所以dp[2][2] = 1 。 显然T 中的"ra" 也匹配S中的 "rab",所以s[2][3] 至少可以等于dp[2][2]。

(2) 如果T[i-1] == S[j-1], 那么dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0);

比如, T中的"rab"和S中的"rab"显然匹配,

根据(1), T中的"rab"显然匹配S中的"rabb",所以dp[3][4] = dp[3][3] = 1,

根据(2), T中的"rab"中的b等于S中的"rab1b2"中的b2, 所以要把T中的"rab"和S中的"rab1"的匹配个数累加到当前的dp[3][4]中。 所以dp[3][4] += dp[2][3] = 2;

(3) 初始情况是

dp[0][0] = 1; // T和S都是空串.

dp[0][1 ... S.length() ] = 1; // T是空串,S只有一种子序列匹配。

dp[1 ... T.length() ][0] = 0; // S是空串,T不是空串,S没有子序列匹配。

 class Solution{
public:
int numDistinct(string S, string T){
vector<vector<int>> dp(T.length() + 1, vector<int>(S.length() + 1, 0));
dp[0][0] = 1;
for (int i = 1; i<S.length() + 1; i++){
dp[0][i] = 1;
}
for (int i = 1; i<T.length() + 1; i++){
dp[i][0] = 0;
}
for (int i = 1; i<T.length() + 1; i++){
for (int j = 1; j<S.length() + 1; j++){
dp[i][j] = dp[i][j - 1];
if (S[j - 1] == T[i - 1]){
dp[i][j] += dp[i - 1][j - 1];
}
}
}
return dp[T.length()][S.length()];
}
};

最新文章

  1. HostOnly Cookie和HttpOnly Cookie
  2. 我 &amp;&amp; yii2(日志埋点,邮件提醒)
  3. MFC之向导页、消息框、文件选择、字体、颜色(三)
  4. (转载)R14也称作子程序连接寄存器
  5. HTML在IE中的条件注释
  6. linux创建用户和用户组
  7. 华为OJ平台——尼科彻斯定理
  8. HDU1036 Average is not Fast Enough!
  9. C#中抽象类和接口的区别3
  10. 七月在线爬虫班学习笔记(五)——scrapy spider的几种爬取方式
  11. JavaScript 二进制转文件
  12. 修改PL/ORACLE字符编码集
  13. scrapy_novel_python
  14. Flutter基础用法解析
  15. Python time &amp; datetime模块
  16. 斐波那契数列(python)
  17. Jmeter录制APP脚本
  18. vue2.0学习笔记之路由(二)路由嵌套+动画
  19. 通过HttpClient调用服务
  20. Bootstrap tab插件的使用

热门文章

  1. 微信小程序去除button边框
  2. 树形DP Gym 100496H House of Representatives
  3. 思维题 UVA 10881 Piotr&#39;s Ants
  4. Spring Boot (33) 分布式锁
  5. netty 引用计数器 ,垃圾回收
  6. 解析SQLite中的常见问题与总结详解
  7. CF540B School Marks
  8. Django--2、form表单
  9. ES6特性之模块【Modules】
  10. 生产环境4.3.5jboss内存调优