1. 程式人生 > 其它 >516. 最長迴文子序列

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/