516. 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
提示:
1 <= s.length <= 1000
s 仅由小写英文字母组成
动态规划
将这道题看成求一个字符串和它的反转串的最长公共子序列
class Solution {
public:int dp[1005][1005];int longestCommonSubsequence(string text1, string text2) {int m=text1.size(),n=text2.size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){int same=(text1[i]==text2[j])?1:0;if(i==0&&j==0) dp[i][j]=same;else if(i==0) dp[i][j]=dp[i][j-1]||same;else if(j==0) dp[i][j]=dp[i-1][j]||same;else if(same) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}return dp[m-1][n-1];}int longestPalindromeSubseq(string s) {string temp=s;reverse(s.begin(),s.end());return longestCommonSubsequence(s,temp);}
};