• 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];
        }
    };
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    暑假第二十七测
    暑假第二十七测
    【真题解】牛宫
    【伪题解】牛宫
    最优贸易
    跳马问题
    求和问题
    【题解】山区建小学
    OpenStack之虚机冷迁移代码简析
    OpenStack之虚机热迁移代码解析
  • 原文地址:https://www.cnblogs.com/zl1991/p/14718492.html
Copyright © 2020-2023  润新知