【重点】【DP】1143.最长公共子序列|516.最长回文子序列

两个求解代码类似的题目,对比记忆!!!

1143.最长公共子序列

题目

法1:DP,考虑空串

class Solution {
   
    public int longestCommonSubsequence(String text1, String text2) {
   
        int m = text1.length() + 1, n = text2.length() + 1; // 加1是在构建二维矩阵时增加空串情况, 简化计算
        int[][] dp = new int[m][n];
        for (int i = 1; i < m; ++i) {
   
            for (int j = 1; j < n; ++j) {
   
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
   
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
   
                    dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
                }
            }
        }


        return dp[m - 1][n - 1];
    }
}

法2:DP,不考虑空串

代码会啰嗦很多,所以还是法1好哇!!!

class Solution {
   
    public int longestCommonSubsequence(String text1, String text2) {
   
        int m = text1.length(), n = text2.length();
        int[][] dp = new int[m][n];
        boolean existed = false;
        for (int i = 0; i < n; ++i) {
   
            dp[0][i] = (existed || text1.charAt(0) == text2.charAt(i)) ? 1 : 0;
            if (dp[0][i] == 1) {
   
                existed = true;
            }
        }
        existed = false;
        for (int i = 0; i < m; ++i) {
   
            dp[i][0] = (existed || text1.charAt(i) == text2.charAt(0)) ? 1 : 0;
            if (dp[i][0] == 1) {
   
                existed = true;
            }
        }

        for (int i = 1; i < m; ++i) {
   
            for (int j = 1; j < n; ++j) {
   
                if (text1.charAt(i) == text2.charAt(j)) {
   
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
   
                    dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
                }
            }
        }

        return dp[m - 1][n - 1];
    }
}

516.最长回文子序列

题目

class Solution {
   
    public int longestPalindromeSubseq(String s) {
   
        int n = s.length();
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; ++i) {
   
            dp[i][i] = 1;
        }
        for (int i = n - 1; i >= 0; --i) {
   
            for (int j = i + 1; j < n; ++j) {
   
                if (s.charAt(i) == s.charAt(j)) {
   
                    dp[i][j] = (j - i == 1 ? 0 : dp[i + 1][j - 1]) + 2;
                } else {
   
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }

        return dp[0][n - 1];
    }
}

相关推荐

  1. Leetcode 1143 公共序列

    2023-12-23 12:48:03       48 阅读
  2. Leetcode 1143:公共序列

    2023-12-23 12:48:03       43 阅读
  3. 每日OJ题_dp⑤_力扣516. 序列

    2023-12-23 12:48:03       39 阅读
  4. 公共上升序列——DP

    2023-12-23 12:48:03       53 阅读
  5. 动态规划 Leetcode 516 序列

    2023-12-23 12:48:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 12:48:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 12:48:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 12:48:03       82 阅读
  4. Python语言-面向对象

    2023-12-23 12:48:03       91 阅读

热门阅读

  1. 我的创作纪念日

    2023-12-23 12:48:03       76 阅读
  2. 【宽度优先搜索 BFS】LeetCode-200. 岛屿数量

    2023-12-23 12:48:03       57 阅读
  3. 《open3D+pyqt》第一章——las格式点云读取

    2023-12-23 12:48:03       61 阅读
  4. SpringMVC系列之技术点定向爆破一

    2023-12-23 12:48:03       56 阅读
  5. vue点击当前盒子以外任意地方隐藏当前盒子

    2023-12-23 12:48:03       60 阅读
  6. 登录接口开发 - 登录注册开发入门(3)

    2023-12-23 12:48:03       69 阅读
  7. js判断是否到T+N的时间限制

    2023-12-23 12:48:03       66 阅读
  8. RK3588 CPHY camera调试(LT7911UXC)

    2023-12-23 12:48:03       117 阅读