Leetcode 516. 最长回文子序列 动态规划

 

 

/*
 * @lc app=leetcode.cn id=516 lang=cpp
 *
 * [516] 最长回文子序列
 *
 * https://leetcode-cn.com/problems/longest-palindromic-subsequence/description/
 *
 * algorithms
 * Medium (61.12%)
 * Likes:    437
 * Dislikes: 0
 * Total Accepted:    47.4K
 * Total Submissions: 77.4K
 * Testcase Example:  '"bbbab"'
 *
 * 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
 * 
 * 
 * 
 * 示例 1:
 * 输入:
 * 
 * "bbbab"
 * 
 * 
 * 输出:
 * 
 * 4
 * 
 * 
 * 一个可能的最长回文子序列为 "bbbb"。
 * 
 * 示例 2:
 * 输入:
 * 
 * "cbbd"
 * 
 * 
 * 输出:
 * 
 * 2
 * 
 * 
 * 一个可能的最长回文子序列为 "bb"。
 * 
 * 
 * 
 * 提示:
 * 
 * 
 * 1 <= s.length <= 1000
 * s 只包含小写英文字母
 * 
 * 
 */

思路:

labuladong

使用二维dp数组记录,其中dp[i][j]表示以i开头j结尾的字符串中的最长回文子序列长度。

初始化时,dp[i][i]=1,表示自身。dp[i][j] i>j时肯定为0,所以只需要遍历右上三角部分

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n=s.size();
        vector<vector<int>> dp(n, vector<int>(n,0));
        for(int i=0;i<n;++i){
            dp[i][i]=1;
        }
        for(int i=n-1;i>=0;--i){
            for(int j=i+1;j<n;++j){
                if(s[i]==s[j]){
                    dp[i][j]=dp[i+1][j-1]+2;
                }
                else{
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[0][n-1];
    }
};

 

posted @ 2021-04-29 16:23  鸭子船长  阅读(113)  评论(0编辑  收藏  举报