链表算法题(程序员面试宝典)
解题思路主要来源于leetcode官方与《程序员面试宝典》。
516. 最长回文子序列
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
示例 1:
输入:
“bbbab”
输出:
4
一个可能的最长回文子序列为 “bbbb”。
示例 2:
输入:
“cbbd”
输出:
2
一个可能的最长回文子序列为 “bb”。
提示:
1 <= s.length <= 1000
s 只包含小写英文字母
解题方法
参考资料1:https://mp.weixin.qq.com/s/zNai1pzXHeB2tQE6AdOXTA
解题思路1
动态规划
class Solution {
public int longestPalindromeSubseq(String s) {
//动态规划
//dp[i][j] 代表是s[i..j] 的最长回文自序列
int[][] dp = new int[s.length()][s.length()];
//base case
//i一定小于等于j 才符合条件 所以矩阵dp 下三角为0
//当i等于j时,即字符串s 为单个字符 最长回文子序列长度肯定为1
for(int[] row:dp){
Arrays.fill(row,0);
}
for(int i=0;i<s.length();i++){
dp[i][i] = 1;
}
//从左至右,从下至上填充 数组dp[i][j]
for(int j=1;j<s.length();j++){
for(int i=j-1;i>=0;i--){
if(s.charAt(i)==s.charAt(j)){
//当是s[i]==s[j] 时
dp[i][j] = dp[i+1][j-1]+2;
}else{
//取s[i..j-1] s[i+1..j]的最长回文子序列长度
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);
}
}
}
return dp[0][s.length()-1];
}
}