(M)Dynamic Programming:516. Longest Palindromic Subsequence

来源:互联网 发布:php 二维数组 push 编辑:程序博客网 时间:2024/06/02 03:14

这个题一开始没思路,看了别人的答案发现自己题意没理解好。理解好了其实很简单,典型的动态规划。套用别人写的思路:

这个题的子问题是:任意一个该字符串的子串包含的回文串的长度,那么对于这个字符串的子串,我们可以用它在原字符串中的起始位置和结束位置来表示。因此,我们可以用一个二维数组来对子问题进行表示,dp[i][j]表示he longest palindromic subsequence's length of substring(i, j)。则递推表达式是:

dp[i][j] = dp[i+1][j-1] + 2 if s.charAt(i) == s.charAt(j)
otherwise, dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])
Initializationdp[i][i] = 1

class Solution {public:    int longestPalindromeSubseq(string s) {        int len = s.size();        vector<vector<int>> dp(len, vector<int>(len, 0));        for(int i = 0; i < len; i++){            dp[i][i] = 1;            for(int j = i - 1; j >= 0; j--)            {                if(s[i] == s[j])                    dp[j][i] = dp[j+1][i-1] + 2;                else                    dp[j][i] = max(dp[j+1][i], dp[j][i-1]);            }        }        return dp[0][len-1];    }};
很多用动态规划找回文子串的递推公式都和这个很像,可以着意记一下。都是比较两边的字符