每周LeetCode算法题(十四)
题目: 516. Longest Palindromic Subsequence
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”.
解法分析
本题求最大回文子序列长度。思路是,序列从中间往外扩,如果两端的字符相同就给长度加2,不相同就取两端以内(包含两端)的最大长度。令dp[i][j]表示字符串s下标i处为右端,下标j处为左端的子序列的最大长度,那么用两层循环遍历字符串,最后得到的dp[s.size() - 1][0]就是所求的最大回文子序列长度。
C++代码
class Solution {
public:
int longestPalindromeSubseq(string s) {
int len = s.size();
int ** dp = new int*[len];
for (int i = 0; i < len; i++) {
dp[i] = new int[len];
memset(dp[i], 0, sizeof(int) * len);
}
for (int i = 0; i < len; i++) {
dp[i][i] = 1;
for (int j = i - 1; j >= 0; j--) {
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[len - 1][0];
}
};