516. 最长回文子序列

动态规划

class Solution {
    public int longestPalindromeSubseq(String s) {

        /**
         * 类似于《647. 回文子串》
         * dp[i][j]定义为区间为[i, j]内最长的回文子串长度
         * 初始化每个字符就是一个回文串,即每个dp[i][i] == 1
         */
        int[][] dp = new int[s.length()][s.length()];

        for (int i = s.length() - 1; i >= 0; i--) {

            dp[i][i] = 1;

            for (int j = i + 1; j < s.length(); j++) {

                /**
                 * 如果i和j的字符相等,且i和j是同一个字符或者是相邻字符,或者i往右缩一步,j往左缩一步得到的字符串也是回文串
                 * 就可以确定[i, j]区间也是回文串
                 * 否则就分别让i或j各退一步,计算最大值
                 */
                if (s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }
                else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }

        return dp[0][s.length() - 1];
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n^2)
 */

https://leetcode-cn.com/problems/longest-palindromic-subsequence/

posted @   振袖秋枫问红叶  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示