217 字
1 分钟
LeetCode 题解-516.longest-palindromic-subsequence

对Leetcode 516.longest-palindromic-subsequence 题目的求解。

Problem Description#

Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000.

Example 1#

Input:
"bbbab"
Output:
4

Example 2#

Input:
"cbbd"
Output:
2

Analysis#

这道题目和第5题类似,不过第五题中我们考虑的时候包含区间头尾的回文串,而在这道题目中,我们需要考虑区间内的最长回文串,是一道很明显的动态规划题目,递归公式为

dp[i][j] = max(dp[i+1][j], dp[i][j-1]) if s[i] neq s[j]
dp[i][j] = max(dp[i+1][j], dp[i][j-1], dp[i+1][j-1]+2) if s[i] eq s[j]

Solution 1: bfs with recursive call#

class Solution {
public static int longestPalindromeSubseq(String s) {
int l = s.length();
if (l == 0) return 0;
int dp[][] = new int [l][l];
//int start = 0;
for (int i = l-1; i >= 0; --i){
for (int j = i; j < l ; ++j){
//System.out.printf("%d %d\n", i, j);
if (i == j) dp[i][j] = 1;
//dp[i][j] = Math.max(dp[i][i+len-2], dp[i+1][i+len]);
else if (s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1]+2;
}
else dp[i][j] = Math.max(dp[i][j-1], dp[i+1][j]);
}
}
return dp[0][l-1];
}
}