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];
    }
};
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号