示例代码

class Solution {
public:
    int longestPalindromeSubseq(string s) {
       int len=s.length();
        //字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
        vector<vector<int>> dp(len+1,vector<int>(len+1));
        //手动初始化一下,当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。
        for(int i=1;i<=len;i++){
            dp[i][i]=1;
        }
        //如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1]
        // 所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。
        for(int i=len;i>0;i--){
            //由于dp数组的定义得到的
            for(int j=i+1;j<=len;j++){
                if(s[i-1]==s[j-1]){
                    dp[i][j]=dp[i+1][j-1]+2;
                }else{
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[1][len];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

效果展示

LeetCode---516. 最长回文子序列(动态规划)_动态规划

相似题目

LeetCode—647. 回文子串(双指针/动态规划)+5. 最长回文子串(动态规划)