0516. Longest Palindromic Subsequence
https://leetcode.com/problems/longest-palindromic-subsequence
Description
Given a string s
, find the longest palindromic subsequence's length in s
.
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.
Example 1:
**Input:** s = "bbbab"
**Output:** 4
**Explanation:** One possible longest palindromic subsequence is "bbbb".
Example 2:
**Input:** s = "cbbd"
**Output:** 2
**Explanation:** One possible longest palindromic subsequence is "bb".
Constraints:
1 <= s.length <= 1000
s
consists only of lowercase English letters.
ac1: recursion + memorization
If the two ends of a string are the same, then they must be included in the longest palindrome subsequence. Otherwise, both ends cannot be included in the longest palindrome subsequence.
int longestPalindromeSubseq(string s) {
int n = s.size();
vector<vector<int>> mem(n,vector<int>(n));
return longestPalindromeSubseq(0,n-1, s,mem);
}
int longestPalindromeSubseq(int l, int r, string &s, vector<vector<int>>& mem) {
if(l==r) return 1;
if(l>r) return 0;
if(mem[l][r]) return mem[l][r];
return mem[l][r] = s[l]==s[r] ? 2 + longestPalindromeSubseq(l+1,r-1, s,mem) :
max(longestPalindromeSubseq(l+1,r, s,mem),longestPalindromeSubseq(l,r-1, s,mem));
}
ac2: dp
similar: https://leetcode.com/problems/longest-palindromic-substring
class Solution {
public int longestPalindromeSubseq(String s) {
// edge cases
if (s == null || s.length() == 0) return 0;
int n = s.length();
int[][] dp = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = i; j >= 0; j--) {
if (s.charAt(j) == s.charAt(i)) {
dp[j][i] = j == i || j + 1 == i ? i - j + 1 : 2 + dp[j+1][i-1];
} else {
dp[j][i] = Math.max(dp[j+1][i], dp[j][i-1]);
}
}
}
return dp[0][n-1];
}
}
Last updated
Was this helpful?