Skip to content
On this page

最长回文子序列

TIP

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

思路

  • dp[i][j]:字符串s[i, j]范围内最长的回文子序列的长度为dp[i][j]
  • 如果s[i]s[j]相同,那么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]);

一定要注意遍历顺序!!

img
js
var longestPalindromeSubseq = function(s) {
    let dp = Array(s.length+1).fill().map(() => Array(s.length + 1).fill(0));
    for (let i = 0; i < s.length; i++) dp[i][i] = 1;
    for(let i=s.length-1;i>=0;i--){
        for(let j=i+1;j<s.length;j++){
            if(s[i]===s[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][s.length-1]
};