516. 最長迴文子序列
阿新 • • 發佈:2022-03-04
動態規劃
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/