题目:给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
例子:
输入: “bbbab”
输出: 4
思路:此题使用动态规划可以解决
动态规划四要素
-
状态:dp[i][j]表示从第i个位置到第j个位置的子串的最长回文子序列
-
状态转移方程:
如果s.charAt(i) == s.charAt(j) dp[i][j] = dp[i + 1][j - 1] + 2;
如果s.charAt(i) != s.charAt(j) dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
然后注意遍历顺序,i 从最后一个字符开始往前遍历,j 从 i + 1 开始往后遍历,这样可以保证每个子问题都已经算好了。 -
初始化:dp[i][i] = 1
-
返回结果:dp[0][n-1]
class Solution {
public int longestPalindromeSubseq(String s) {
if(s == null || s.length() == 0){
return 0;
}
int n = s.length();
int[][] dp = new int[n][n];
for(int i = 0 ; i < n ; i++){
dp[i][i] = 1;
}
for(int i = n - 1 ; i >=0 ; i--){
for(int j = i + 1 ; j < n ; 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]);
}
}
}
return dp[0][n - 1];
}
}