← 返回目录

115. 不同的子序列

第 18 / 42 卷日期:

115. 不同的子序列

题目描述:

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

dp五部曲:

  1. dpi 表示 s下标在[0,i-1]中与 t下标在[0,j-1]中不同子序列的个数

int dp = new intm + 1;

  1. 递推公式:(两类情况)

if (s.charAt(i - 1) == t.charAt(j - 1)) // 匹配

这第一类又分为两小种情况:

由于不用连续,所以,计算当前位置匹配,仍然可以选择不使用当前元素;即,dpi - 1;

如果使用当前元素进行匹配,则 dpi - 1 第一大类情况是这两小种情况之和

即,dpi = dpi - 1 + dpi - 1;

if (s.charAt(i - 1) == t.charAt(j - 1)) // 不匹配,则删除s[i-1]

dpi = dpi - 1;

  1. 初始化

dpi 表示删除s[i]后是空串的个数,所以全是1 dp0 表示删除空串s后是t[j-1]的个数,不可能,所以全是0

  1. 顺序:从左到右
  2. 打印dp

516. 最长回文子序列

题目描述:

给定一个字符串 s,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000。

子串连续,但是子序列可以不连续

dp 五步曲:

  1. dp[i] 表示:如果子串[i,j]范围内最长回文串的长度

int dp = new int[n];

  1. 递推公式

if (s.charAt(i) == s.charAt(j)) { // 首尾匹配

dp[i] = dp[i] + 1 + 2;

if (s.charAt(i) != s.charAt(j)) { // 首尾不匹配

首尾字符不匹配,则 [i,j]子串一定不是回文串,则需要看[i+1,j]和[i,j-1]中的max回文串 dp[i] = Math.max(dp[i] + 1, dp[i]);

全站分卷索引 · 42 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
  2. 2找出所有子集的异或总和再求和
  3. 3哈希表
  4. 4哈希冲突
  5. 5红黑树与AVL树
  6. 6平衡二叉树(AVL树)
  7. 7将有序数组转换为二叉搜索树
  8. 83. 分割(组合问题)
  9. 9方法论
  10. 10509. 斐波那契数
  11. 1162. 不同路径
  12. 1296. 不同的二叉搜索树
  13. 13322. 零钱兑换
  14. 14爬楼梯
  15. 15背包小总结 (01背包、完全背包)
  16. 16子序列问题
  17. 17674. 最长连续递增序列
  18. 18115. 不同的子序列
  19. 19总结
  20. 20技巧总结
  21. 21时间序列模型
  22. 22区间DP模型
  23. 23664. 奇怪的打印机
  24. 24编辑距离
  25. 25回文串
  26. 26DP递推公式总结
  27. 27排序算法
  28. 28其他算法
  29. 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
  30. 302. TOP N问题
  31. 313. 分布式的TOP N问题
  32. 322. Astar数据结构 + 公式
  33. 334. 代码实现
  34. 345. 总体代码
  35. 35堆排序
  36. 36单源最短路
  37. 37思维导图
  38. 38链表
  39. 39回溯
  40. 40贪心
  41. 41动态规划
  42. 42排序