LeetCode.516 最长回文子序列 详解

题目详情

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000

示例 1:
输入:

"bbbab"

输出:

4

一个可能的最长回文子序列为 "bbbb"。

示例 2:
输入:

"cbbd"

输出:

2

一个可能的最长回文子序列为 "bb"。

解法

解法1: 动态规划

此题很容易想到动态规划,

像这种子字符串的题, 首先就能用二维数组dp[i][j]表示下标i~j的最优解

很容易得到下列递推式

				dp[i+1][j-1]  s[i] == s[j]
dp[i][j] = 		  
				max(dp[i+1][j], dp[i][j-1])  s[i] != s[j]

初始条件 dp[i][i] = 1也可以轻松得到

AC代码

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.length(),vector<int>(s.length()));
        int len = s.size();
        
        for (int i = len - 1; i >= 0; i--) {
            
            dp[i][i] = 1;
            
            for (int j = i+1; j < len; 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][len-1];

    }
};
posted @ 2018-12-10 23:36  qq874455953  阅读(272)  评论(0编辑  收藏  举报