Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:
"bbbab"
Output:
4
One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:
"cbbd"
Output:
2
One possible longest palindromic subsequence is "bb".
Hint:
要找最长回文子序列,我们可以使用动态规划的算法:
dp[i][j]:表示对于s[i to j]这一子串中的最长回文子序列长度。
当i = j dp[i][j] = 1;
当i > j dp[i][j] = 0;
当i < j && s[i] = s[j] dp[i][j] = dp[i+1][j-1]+2;
当i < j && s[i] != s[j] dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
时间复杂度为O(n^2),空间复杂度为O(n^2)
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n = s.length();
vector<vector<int>> dp(n, vector<int>(n, 0));
if (n == 0) return 0;
for (int j = 0; j < n; j++) {
dp[j][j] = 1;
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][j-1], dp[i+1][j]);
}
}
}
return dp[0][n-1];
}
};
可以优化,降低空间复杂度至O(n)。
维护一个一维数组,长度为字符串长度。每次对j的迭代,我们使得dp[i]的值为dp[i][j-1]的值。
class Solution {
public:
int longestPalindromeSubseq(string s) {
int dp[1000];
int pp,p;
if (s.length() == 0) return 0;
for (int i = 0; i < s.length(); i++) {
dp[i] = 0;
}
for (int j = 0; j < s.length(); j++) {
dp[j] = 1;
pp = p = 0;
for (int i = j-1; i >= 0; i--) {
p = dp[i];
if (s[i] == s[j]) {
dp[i] = pp+2;
} else {
dp[i] = max(dp[i], dp[i+1]);
}
pp = p;
}
}
return dp[0];
}
};