当前位置:   article > 正文

代码随想录-算法训练营day54【动态规划15:判断子序列、不同的子序列】

代码随想录-算法训练营day54【动态规划15:判断子序列、不同的子序列】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

  1. 第九章 动态规划part15
  2. ● 392.判断子序列
  3. ● 115.不同的子序列
  4. 详细布置
  5. 392.判断子序列
  6. 这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了
  7. https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html
  8. 115.不同的子序列
  9. 但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。
  10. https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html

目录

0392_判断子序列

0115_不同的子序列


0392_判断子序列

  1. package com.question.solve.leetcode.programmerCarl2._10_dynamicProgramming;
  2. import java.util.Arrays;
  3. public class _0392_判断子序列 {
  4. }
  5. class Solution0392 {
  6. public boolean isSubsequence(String s, String t) {
  7. int length1 = s.length();
  8. int length2 = t.length();
  9. int[][] dp = new int[length1 + 1][length2 + 1];
  10. for (int i = 1; i <= length1; i++) {
  11. for (int j = 1; j <= length2; j++) {
  12. if (s.charAt(i - 1) == t.charAt(j - 1)) {
  13. dp[i][j] = dp[i - 1][j - 1] + 1;
  14. } else {
  15. dp[i][j] = dp[i][j - 1];
  16. }
  17. }
  18. }
  19. if (dp[length1][length2] == length1) {
  20. return true;
  21. } else {
  22. return false;
  23. }
  24. }
  25. }
  26. class Solution0392_2 {
  27. //修改遍历顺序后,可以利用滚动数组,对dp数组进行压缩
  28. public boolean isSubsequence(String s, String t) {
  29. //修改遍历顺序,外圈遍历t,内圈遍历s。使得dp的推算只依赖正上方和左上方,方便压缩。
  30. int[][] dp = new int[t.length() + 1][s.length() + 1];
  31. for (int i = 1; i < dp.length; i++) {//遍历t字符串
  32. for (int j = 1; j < dp[i].length; j++) {//遍历s字符串
  33. if (t.charAt(i - 1) == s.charAt(j - 1)) {
  34. dp[i][j] = dp[i - 1][j - 1] + 1;
  35. } else {
  36. dp[i][j] = dp[i - 1][j];
  37. }
  38. }
  39. System.out.println(Arrays.toString(dp[i]));
  40. }
  41. return dp[t.length()][s.length()] == s.length();
  42. }
  43. }
  44. class Solution0392_3 {//状态压缩
  45. public boolean isSubsequence(String s, String t) {
  46. int[] dp = new int[s.length() + 1];
  47. for (int i = 0; i < t.length(); i++) {
  48. //需要使用上一轮的dp[j - 1],所以使用倒序遍历
  49. for (int j = dp.length - 1; j > 0; j--) {
  50. //i遍历的是t字符串,j遍历的是dp数组,dp数组的长度比s的大1,因此需要减1。
  51. if (t.charAt(i) == s.charAt(j - 1)) {
  52. dp[j] = dp[j - 1] + 1;
  53. }
  54. }
  55. }
  56. return dp[s.length()] == s.length();
  57. }
  58. }
  59. class Solution0392_4 {
  60. public boolean isSubsequence(String s, String t) {
  61. boolean[] dp = new boolean[s.length() + 1];
  62. //表示“”是t的子序列
  63. dp[0] = true;
  64. for (int i = 0; i < t.length(); i++) {
  65. for (int j = dp.length - 1; j > 0; j--) {
  66. if (t.charAt(i) == s.charAt(j - 1)) {
  67. dp[j] = dp[j - 1];
  68. }
  69. }
  70. }
  71. return dp[dp.length - 1];
  72. }
  73. }

0115_不同的子序列

  1. package com.question.solve.leetcode.programmerCarl2._10_dynamicProgramming;
  2. public class _0115_不同的子序列 {
  3. }
  4. class Solution0115 {
  5. public int numDistinct(String s, String t) {
  6. int[][] dp = new int[s.length() + 1][t.length() + 1];
  7. for (int i = 0; i < s.length() + 1; i++) {
  8. dp[i][0] = 1;
  9. }
  10. for (int i = 1; i < s.length() + 1; i++) {
  11. for (int j = 1; j < t.length() + 1; j++) {
  12. if (s.charAt(i - 1) == t.charAt(j - 1)) {
  13. dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
  14. } else {
  15. dp[i][j] = dp[i - 1][j];
  16. }
  17. }
  18. }
  19. return dp[s.length()][t.length()];
  20. }
  21. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/660418
推荐阅读
相关标签
  

闽ICP备14008679号