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

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.

问题:给定字符串 S, T, 求 T 在 S 中有多少个不同的子序列。

一开始看到这道题,没有思路,在网上看了别人的解答才了解到如何解题。这是一道 dp 题,如果能想得到状态转义 关系,答案就比较明显了。解法有点想 背包问题的解法。

二维数组 vv[T.len][S.len] 存储中间结果。 vv[i][k], 表示 T[0, i] 在 S[0, k] 中的不同的子序列个数。

状态转换关系,文字描述:

  当 S[i] 和 T[k] 不相等时, T[0, i] 在 S[0, k] 的不同子序列个数,和在S[0, k-1] 的不同子序列个数相同。

  当 S[i] 和 T[k] 相同时, T[0, i] 在 S[0, k] 的不同子序列个数等于 S[i] 被采取的情况( vv[i-1][k-1] ), 加上 S[i] 不被采取的情况 ( vv[i][k-1] )。

状态转换关系,公式表示:

  当 S[i] != T[k] 时,vv[i][k] = vv[i][k-1]

  当 S[i] == T[k] 时,vv[i][k] = vv[i-1][k-1] + vv[i][k-1]

 int numDistinct(string s, string t) {

     if (t.size() > s.size()) {
return ;
} vector<vector<int>> vv(t.size(), vector<int>(s.size(), -)); // 边界值处理
for (int i = ; i < vv.size(); i++) {
vv[i][i-] = ;
} // 边界值处理
if (s[] == t[]) {
vv[][] = ;
}else{
vv[][] = ;
} // 边界值处理
for (int i = ; i < vv[].size(); i++) {
if (t[] == s[i]) {
vv[][i] = vv[][i-] + ;
}else{
vv[][i] = vv[][i-];
}
} // 状态转移
for (int i = ; i < vv.size(); i++) {
for (int k = i ; k < vv[i].size(); k++) {
if (t[i] != s[k]) {
vv[i][k] = vv[i][k-];
}else{
vv[i][k] = vv[i-][k-] + vv[i][k-];
}
}
} return vv[t.size()-][s.size()-];
}

最新文章

  1. HDU 1528 贪心模拟/二分图
  2. iOS - Safe iOS 加密安全
  3. Sublime Text 2配置
  4. BZOJ1937 [Shoi2004]Mst 最小生成树
  5. Ajax的工作原理
  6. 大陆居民身份证验证方法(java)
  7. BZOJ_1036_[ZJOI2008]_树的统计Conut_(树链剖分)
  8. android——字体颜色跟随状态改变
  9. ios 学习动画的套路 (一)
  10. vue 从入门到精通(一)
  11. 七、Spring Boot Servlet 使用
  12. SSM整合Netty5.0详细说明
  13. (原创)cocos2dx-lua TableView官方demo分析
  14. word交叉引用公式编号时和连公式一起引用
  15. Scrapy爬虫(5)爬取当当网图书畅销榜
  16. 一个Silverlight工程的各文件解析
  17. Lua学习总结
  18. VS Code 安装sass插件
  19. Ubuntu16.04下安装配置phpmyadmin
  20. STM32F412应用开发笔记之十:多组分气体分析仪设计验证

热门文章

  1. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
  2. Synchronized vs SyncRoot
  3. 使用微软企业库5.0提供的unity配置解藕系统demo(源码)
  4. oracle查询最占用资源的查询
  5. easyui中datagrid标题居中内容居左实现方式
  6. js常用字符串函数
  7. svn服务器时间与本地时间不同步解决
  8. 对于volatile的理解
  9. linux下安装busybox
  10. Java简单购物车设计