题目链接

最长回文子序列

题目描述

image.png

实现代码

动态规划思想:记dp[i][j]表示从i到j索引位置的子串的最长回文子序列长度,则有两种情况:

  1. s[i] == s[j]时:dp[i][j] = dp[i-1][j-1] + 2
  2. s[i] ≠ s[j]时:dp[i][j] = max(dp[i+1][j], dp[i][j-1])

初始化条件:dp[i][i] = 1

实现代码:

  1. class Solution {
  2. public int longestPalindromeSubseq(String s) {
  3. int n = s.length();
  4. int[][] dp = new int[n][n];
  5. for (int i = n - 1; i >= 0; i--) {
  6. dp[i][i] = 1;
  7. char c1 = s.charAt(i);
  8. for (int j = i + 1; j < n; j++) {
  9. char c2 = s.charAt(j);
  10. if (c1 == c2) {
  11. dp[i][j] = dp[i + 1][j - 1] + 2;
  12. } else {
  13. dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
  14. }
  15. }
  16. }
  17. return dp[0][n - 1];
  18. }
  19. }