题目描述
给定一个字符串 s
,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s
的最大长度为 1000
。
示例:
输入:“bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb”。
示例2:
输入:“cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb”。
题目思路
动态规划
- 如果相等,就等于s[i + 1]到s[j - 1]这段子串的最长回文子序列 + 2(2就是当前正在比较的相等的2个字符的长度)
转移方程:
dp[i][j] = dp[i + 1][j - 1] + 2;
- 如果不等,就等于s[i + 1]到s[j]或者s[i]到s[j - 1]这两段子串的最长回文子序列中的最大的那一个
转移方程:
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1])
class Solution {
public int longestPalindromeSubseq(String s) {
if (s == null || s.length() == 0)
return 0;
char[] chars = s.toCharArray();
int n = s.length();
int[][] dp = new int[n][n];
for (int i = 0; i < n; i++) {
dp[i][i] = 1;// dp[i][j]表示从i到j的子串中包含的最大回文子序列
}
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (chars[i] == chars[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];
}
}