本文共 1279 字,大约阅读时间需要 4 分钟。
为了找到给定字符串 s 中的最长回文子序列,我们可以使用动态规划的方法。该方法通过建立一个二维数组 dp,其中 dp[i][j] 表示从索引 i 到 j 的最长回文子序列的长度。
n x n 的二维数组 dp,其中 n 是字符串的长度。所有元素初始化为 0。dp 数组:遍历每个可能的子区间 [i, j]: s[i] 等于 s[j],则 dp[i][j] 等于 2 + dp[i+1][j-1]。dp[i][j] 等于 dp[i+1][j] 和 dp[i][j-1] 中的最大值。dp[0][n-1] 即为最长回文子序列的长度。public class Solution { public int longestPalindromeSubseq(String s) { int n = s.length(); if (n == 0) return 0; // Initialize dp table int[][] dp = new int[n][n]; for (int i = 0; i < n; i++) { dp[i][i] = 1; } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (s.charAt(i) == s.charAt(j)) { if (i + 1 == j - 1) { dp[i][j] = 2; } else { dp[i][j] = 2 + dp[i + 1][j - 1]; } } else { dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]); } } } return dp[0][n - 1]; }} dp 数组的对角线元素 dp[i][i] 初始化为 1,表示单个字符本身是一个长度为1的回文。dp 数组: s[i] 等于 s[j] 时,回文的长度为 2 加上子区间 [i+1, j-1] 内的最长回文长度。[i+1, j] 和 [i, j-1] 内的最大回文长度。dp[0][n-1],即整个字符串的最长回文子序列长度。转载地址:http://giev.baihongyu.com/