想着复制一个反转的字符串,这样问题就转化为了最大子序列。
class Solution {
public:
int longestCommonSubseq(string &s,string &t)
{
int m=s.size(),n=t.size();
vector dp(n+1,0);
int temp,pre;
for(int i=0;i<m;++i)
{
pre=dp[0];
for(int j=1;j<=n;++j)
{
temp=dp[j];
if(t[j-1]==s[i])
dp[j]=pre+1;
else
dp[j]=max(dp[j-1],dp[j]);
pre=temp;
}
}
return dp[n];
}
int longestPalindromeSubseq(string s) {
string t(s);
reverse(t.begin(),t.end());
return longestCommonSubseq(s,t);
}
};
看了答案,方知道自己还是在套公式的阶段,离真正理解动态规划还差的远呢!
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n=s.size();
int dp[n][n];
memset (dp,0,sizeof(dp));
for(int i=0;i<n;i++)
dp[i][i]=1;
for(int i=n-1;i>=0;--i)
{
for(int j=i+1;j<n;++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][n-1];
}
};