zoukankan      html  css  js  c++  java
  • 516. 最长回文子序列(dp)

     

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

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

    示例 1:

    输入:s = "bbbab"
    输出:4
    解释:一个可能的最长回文子序列为 "bbbb" 。
    

    示例 2:

    输入:s = "cbbd"
    输出:2
    解释:一个可能的最长回文子序列为 "bb" 。



    class Solution {
    public:
        int longestPalindromeSubseq(string s) {
            int n = s.size();
            //dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
            vector<vector<int>> dp(n,vector<int>(n,0));
    
            for(int i = 0;i < n; ++i) {
            //首先要考虑当i 和j 相同的情况,从递推公式:dp[i][j] = dp[i + 1][j - 1] + 2; 可以看出 递推公式是计算不到 i 和j相同时候的情况。
        //所以需要手动初始化一下,当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。
                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] 递归而来
                        //如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;
                        dp[i][j] = dp[i+1][j-1] + 2;
    
                    } else {
                        //如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子串的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。
                    //加入s[j]的回文子序列长度为dp[i + 1][j]。
                    //加入s[i]的回文子序列长度为dp[i][j - 1]。
                    //那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                        dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
                    }
                }
            }
        
            return dp[0][n-1];
        }
    };
  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/zle1992/p/15334772.html
Copyright © 2011-2022 走看看