class Solution {
public int longestPalindromeSubseq(String s) {
int length = s.length();
// 初始化 dp 数组,i > j 时,不存在子序列,int 类型默认值为 0
// dp[i][j] 即在子串 s[i...j]中,最长回文子序列的长度
int[][] dp = new int[length][length];
// base case
// 只有一个字符的情况 i == j
for (int i = 0; i < length; i++) {
dp[i][i] = 1;
}
// 最终结果为 dp[0][length - 1] 反向遍历,由下往上,由左往右
for (int i = length - 1; i >= 0; i--) {
for (int j = i + 1; j < length; 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]);
}
}
}
// s 的最长回文子序列长度
return dp[0][length - 1];
}
}
leetcode-516-最长回文子序列
最新推荐文章于 2025-04-24 11:44:54 发布