Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
题目的意思是找到字符串s中最长的回文子序列:
Example 1:
Input:
"bbbab"Output:
4One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:
"cbbd"Output:
2One possible longest palindromic subsequence is "bb".
动态规划解法:设dp[i][j]为s[i]~s[j]之间的最长回文子序列
if i==j dp[i][j] = 1
else if i+1=j
if s[i] == s[j]: dp[i][j] = 2
else : dp[i][j] = 1
else
if s[i] == s[j]: dp[i][j] = max(dp[i+1][j-1]+2, dp[i+1][j], dp[i][j-1])
else: dp[i][j] = max(dp[i+1][j-1], dp[i+1][j], dp[i][j-1])
最后返回s[0][s.size()-1]即为s中最长回文子的序列结果
c++ 代码如下:
class Solution {
public:
int longestPalindromeSubseq(string s) {
if (s.empty()) return 0;
vector<vector<int>> dp(s.size(), vector<int>(s.size()));
for(int len = 0; len < s.size(); len ++){
for(int i = 0; i+len < s.size(); i ++){
int j = i + len;
if(i == j) dp[i][j] = 1;
else if(len == 1) dp[i][j] = (s[i] == s[j] ? 2:1);
else{
dp[i][j] = max(max(dp[i+1][j], dp[i][j-1]),s[i] == s[j] ? dp[i+1][j-1]+2:dp[i+1][j-1]);
}
}
}
return dp[0][s.size()-1];
}
};