Longest Palindromic Subsequence最长回文子序列-动态规划DP的另外一个角度

leetcode 516:

Given a string s, find the longest palindromic subsequence's length in s.
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.

e.g. bbbab->bbbab

这个可以和 leetcode 5 Longest Palindromic Substring一起看,不同的是这是只需要找到最长子序列。
既然是找长度,那没有必要考虑抽取字符串后具体是什么,这样容易钻进牛角尖。
找子序列长度这样的题应该从范围角度考虑。
假设dp[i][j]表示s[i...j]的最长子序列长度,
i!=j && s[i]==s[j],那么肯定有dp[i][j]>=2,因为两头是相同的。所以得到dp[i][j]=dp[i+1][j-1]+2
如果s[i]==s[j], 那么dp[i][j] = max(dp[i+1][j],dp[i][j-1]),这里需要左右都看看。

public int longestPalindromeSubseq(String s) {
        int n = s.length();
        int[][] dp = new int[n][n];

        for (int i = n - 1; i >= 0; i--) {
            dp[i][i] = 1;
            for (int j = i + 1; j < n; 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][n - 1];
    }

posted on 2025-11-18 10:20  Lv Jianwei  阅读(0)  评论(0)    收藏  举报