題目描述:spa
給定一個字符串s,找到其中最長的迴文子序列。能夠假設s的最大長度爲1000。code
示例 1:
輸入:blog
"bbbab"
輸出:字符串
4
一個可能的最長迴文子序列爲 "bbbb"。string
示例 2:
輸入:io
"cbbd"
輸出:class
2
一個可能的最長迴文子序列爲 "bb"。循環
解題思路:di
利用動態規劃求解,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 };