7. Longest Palindromic Subsequence
The problem can be found at the following link: Question Link
Problem Description
Given a string s
, return the length of the longest palindromic subsequence.
A subsequence is a sequence derived from the given sequence by deleting some or no elements without changing the order of the remaining elements. A palindromic subsequence reads the same forwards and backwards.
Examples
Example 1:
Input:
s = "bbabcbcab"
Output:
7
Explanation:
The longest palindromic subsequence is "babcbab"
, which has a length of 7.
Example 2:
Input:
s = "abcd"
Output:
1
Explanation:
The longest palindromic subsequence is any single character, which has a length of 1.
Example 3:
Input:
s = "agbdba"
Output:
5
Explanation:
The longest palindromic subsequence is "abdba"
, which has a length of 5.
Constraints:
$1 \leq s.size() \leq 1000$
The string contains only lowercase letters.
My Approach
DP - Bottom-Up 2D Table
Algorithm Steps:
Create a 2D DP table, where
dp[i][j]
stores the length of the longest palindromic subsequence in substrings[i...j]
.Initialize diagonal elements (
dp[i][i]
) to 1, since a single character is always a palindrome of length 1.Iterate over substrings of increasing lengths.
For each substring
s[i...j]
:If
s[i] == s[j]
, the length extends by 2 (both characters can form a palindrome around the inner subsequences[i+1...j-1]
).Otherwise, take the maximum palindromic subsequence length by either excluding
s[i]
or excludings[j]
.
Final answer is stored in
dp[0][n-1]
β the longest palindromic subsequence in the entire string.
Time and Auxiliary Space Complexity
Expected Time Complexity: $O(N^2)$, as we fill a 2D DP table for all substrings, and each cell is filled in constant time.
Expected Auxiliary Space Complexity: $O(N^2)$, for storing the DP table, which tracks the longest palindromic subsequence length for each substring.
Code (C++)
class Solution {
public:
int longestPalinSubseq(string &s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i + 1; j < n; j++) {
if (s[i] == s[j])
dp[i][j] = 2 + dp[i + 1][j - 1];
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
return dp[0][n - 1];
}
};
Code (Java)
class Solution {
public int longestPalinSubseq(String s) {
int n = s.length();
int[][] dp = new int[n][n];
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i + 1; j < n; j++) {
if (s.charAt(i) == s.charAt(j))
dp[i][j] = 2 + dp[i + 1][j - 1];
else
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
return dp[0][n - 1];
}
}
Code (Python)
class Solution:
def longestPalinSubseq(self, s):
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
dp[i][i] = 1
for j in range(i + 1, n):
if s[i] == s[j]:
dp[i][j] = 2 + dp[i + 1][j - 1]
else:
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
return dp[0][n - 1]
Contribution and Support:
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Letβs make this learning journey more collaborative!
β If you find this helpful, please give this repository a star! β
πVisitor Count
Last updated