class Solution {
public int longestPalindromeSubseq(String s) {
// 1.确定dp数组 dp[i][j]为闭区间[i,j]下标下,最长回文子序列的长度
int n = s.length();
char[] ch = s.toCharArray();
int[][] dp = new int[n][n];
/**
2.确定递推关系
if(ch[i] == ch[j]){
dp[i][j] = dp[i+1][j-1] + 2;
}else{
dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
}
*/
// 3.初始化 i越来越大,j越来越小,从中间会和
for(int i=0; i<n; i++){
dp[i][i] = 1;
}
// 4.遍历顺序 从下往上,从左往右 j比i要大,且dp[i][i]已经初始化
for(int i=n-1; i>=0; i--){
for(int j=i+1; j<n; j++){
if(ch[i] == ch[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];
}
}
运行结果: