1. 程式人生 > >【LeetCode】516. 最長迴文子序列

【LeetCode】516. 最長迴文子序列

題目連結https://leetcode-cn.com/problems/longest-palindromic-subsequence/description/

題目描述

給定一個字串s,找到其中最長的迴文子序列。可以假設s的最大長度為1000。

示例

輸入:

“bbbab”
輸出:

4
一個可能的最長迴文子序列為 “bbbb”。

解決方法

動態規劃,用dp[i][j]表示si…sj的最長迴文子序列,求dp[0][n-1]
遞推公式為:
如果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])

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int dp[1001][1001]={0};
        //初始化dp
        for (int i=0;i<s.size();i++)
            dp[i][i]=1;     
        //轉移dp
        for (int j=1;j<s.size();j++){
            for (int i=j-1;i>=0;i--){
                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]); // cout<<i<<" "<<j<<" "<<dp[i][j]<<endl; } } //得到結果 return dp[0][s.size()-1]; } };