public int longestPalindromeSubseq(String s) {
/*
s转成str字符数组。
dp[i][j]表示str数组i到j之间最长回文子序列的长度。
动态转移方程:dp[i][j]有两种情况,如下。
*/
int n=s.length();
char[]str=s.toCharArray();
int [][]dp=new int [n][n];
for(int i=n-1;i>-1;i--){
for(int j=i;j<n;j++){
if(i==j){
dp[i][j]=1;
}
else if(str[i]==str[j]){
dp[i][j]=2+dp[i+1][j-1];
//当i,j相邻,i+1>j-1,dp[i+1][j-1]处于左下角方向,成为遍历不到元素,即为默认值0.
}
else{//dp[i][j]是在dp[i+1][j-1]添加了str[i],str[j]后最长的回文字符序列
//当str[i]不等于str[j]时,分别添加str[i],str[j]看是否能够构成回文字符序列。
dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]);
}
}
}
return dp[0][n-1];
}
0动态规划 中等 leetcode 516. 最长回文子序列
最新推荐文章于 2024-08-15 05:02:54 发布