Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
dp.
这个最长的镜像子序列不一定是连续的。比如说bbab的最长镜像子序列就是bbb。创建一个dp二维数组,dp[i][j]表示字符串中第i位到第j位之间的最大镜像子序列的长度。
basic step: dp[i][i]=1
state transition:若s[i]=s[j],则dp[i][j]=dp[i+1][j-1]+2;若s[i]!=s[j],则dp[i][j]=max(dp[i+1][j],dp[i][j-1]).
状态转移方程的后一个比较好理解,前一个需要细细考虑。当然第一个条件的强化版dp[i][j]=max(dp[i+1][j-1]+2,dp[i][j-1],dp[i+1][j-1])也是可以,不过其实只要简化版就足够了。
class Solution { public: int longestPalindromeSubseq(string s) { int len=s.length(); vector<vector<int>>dp(len,vector<int>(len)); 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]=dp[i+1][j]>dp[i][j-1]?dp[i+1][j]:dp[i][j-1]; } } } return dp[0][len-1]; } };