@(labuladong的算法小抄)[dp]
leetcode 516. 最长回文子序列
题目描述
解题思路
class Solution {
public int longestPalindromeSubseq(String s) {
if (s == null) return 0;
int n = s.length();
/* 定义:dp[i][j]表示s[i...j]的最长回文子序列的长度 */
int[][] dp = new int[n][n];
/* base case:
dp[i][j] = 1 if i == j
dp[i][j] = 0 if i > j
*/
for (int i = 0; i < n; i++)
dp[i][i] = 1;
for (int i = n - 2; i >= 0; i --) {
for (int j = i + 1; j <= n - 1; j ++) {
if(s.charAt(i) == s.charAt(j)) {
dp[i][j] = 2 + dp[i + 1][j - 1];
} else {
dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
}
}
}
return dp[0][n - 1];
}
}