leetcode 516. 最长回文子序列
题目描述:
给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
示例 1:
输入:
"bbbab"
输出:
4
一个可能的最长回文子序列为 "bbbb"。
示例 2:
输入:
"cbbd"
输出:
2
一个可能的最长回文子序列为 "bb"。
解题思路:
利用动态规划求解,dp[i][j]表示从i到j的连续字符串中的回文序列长度。利用双重循环,判断s[i]==s[j],若相等,dp[i][j] = dp[i+1][j-1]+2。否则,dp[i][j] = max(dp[i+1][j], dp[i][j-1])。
代码:
1 class Solution { 2 public: 3 int longestPalindromeSubseq(string s) { 4 int n = s.length(); 5 if(n==0) 6 return 0; 7 vector<vector<int>> dp(n, vector<int>(n, 0)); 8 for(int i=0; i<n; i++) 9 dp[i][i]=1; 10 for(int j=1; j<n; j++) 11 { 12 for(int i=j-1; i>=0; i--) 13 { 14 if(i==j) 15 continue; 16 if(s[i]==s[j]) 17 dp[i][j] = dp[i+1][j-1]+2; 18 else 19 dp[i][j] = max(dp[i+1][j], dp[i][j-1]); 20 } 21 } 22 return dp[0][n-1]; 23 } 24 };