首页 > 其他 > 详细

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

时间:2021-04-29 18:12:44      阅读:28      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

/*
 * @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];
    }
};

 

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

原文:https://www.cnblogs.com/zl1991/p/14718492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!