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

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

1143.最长公共子序列

题目

法1:DP,考虑空串

java 复制代码
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好哇!!!

java 复制代码
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.最长回文子序列

题目

java 复制代码
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];
    }
}
相关推荐
语戚5 天前
力扣 2463. 最小移动总距离 —— 动态规划 & 贪心排序全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·dp
语戚6 天前
力扣 494. 目标和 —— 回溯 & 动态规划双解法全解(Java 实现)
java·算法·leetcode·动态规划·力扣·dp·回溯
王老师青少年编程8 天前
动态规划之【树形DP】第4课:树形DP应用案例实践3
c++·动态规划·dp·树形dp·csp·信奥赛·提高组
Tisfy1 个月前
LeetCode 1594.矩阵的最大非负积:动态规划O(mn)
leetcode·矩阵·动态规划·dp
像污秽一样1 个月前
算法设计与分析-习题9.1
数据结构·算法·dfs·dp·贪婪
像污秽一样1 个月前
算法设计与分析-习题8.1
数据结构·算法·dfs·dp
CUC-MenG2 个月前
Codeforces Round 1078 (Div. 2) A,B,C,D,E,F1个人题解
数学·前缀和·dfs·模拟·dp·线性dp·后缀和·树上dp
Wuliwuliii3 个月前
高维子集和&子集染色问题
动态规划·dp·子集·子集和·多维子集和
nju_spy3 个月前
力扣每日一题 2026.1
算法·leetcode·二分查找·动态规划·最小生成树·单调栈·最长公共子序列
王老师青少年编程3 个月前
2025年3月GESP真题及题解(C++七级): 图上移动
c++·题解·dp·真题·gesp·七级·图上运动