Longest Palindromic Subsequence最长回文子序列-动态规划DP的另外一个角度
leetcode 516:
Given a string s, find the longest palindromic subsequence's length in s.
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.
e.g. bbbab->bbbab
这个可以和 leetcode 5 Longest Palindromic Substring一起看,不同的是这是只需要找到最长子序列。
既然是找长度,那没有必要考虑抽取字符串后具体是什么,这样容易钻进牛角尖。
找子序列长度这样的题应该从范围角度考虑。
假设dp[i][j]表示s[i...j]的最长子序列长度,
当i!=j && s[i]==s[j],那么肯定有dp[i][j]>=2,因为两头是相同的。所以得到dp[i][j]=dp[i+1][j-1]+2
如果s[i]==s[j], 那么dp[i][j] = max(dp[i+1][j],dp[i][j-1]),这里需要左右都看看。
public int longestPalindromeSubseq(String s) {
int n = s.length();
int[][] dp = new int[n][n];
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1;
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];
}
posted on 2025-11-18 10:20 Lv Jianwei 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号