Longest Palindromic Subsequence LeetCode Solution

Last updated on January 5th, 2025 at 11:59 pm

Here, we see a Longest Palindromic Subsequence LeetCode Solution. This Leetcode problem is solved using different approaches in many programming languages, such as C++, Java, JavaScript, Python, etc.

List of all LeetCode Solution

Topics

Dynamic Programming

Companies

Amazon, Uber

Level of Question

Medium

Longest Palindromic Subsequence LeetCode Solution

Longest Palindromic Subsequence LeetCode Solution

1. Problem Statement

Given a string s, find the longest palindromic subsequence‘s length in s.

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”.

2. Coding Pattern Used in Solution

The coding pattern used in the provided code is “Palindromic Subsequence”. This pattern is commonly used to solve problems related to finding the longest palindromic subsequence or substring in a given string. It involves dynamic programming to break the problem into smaller subproblems and solve them iteratively or recursively.

3. Code Implementation in Different Languages

3.1 Longest Palindromic Subsequence C++

class Solution {
public:
    int longestPalindromeSubseqTabular(string& s) {
        if(s.empty())
            return 0;
        const int N = s.size();
        vector<vector<int> > dp(N, vector<int>(N, 0));
        for(int i = 0; i < N; i++)
            dp[i][i] = 1;
        for(int l = 1; l < N; l++) {
            for(int i = 0; i < N - l; i++) {
                int j = i + l;
                if((j - i + 1) == 2) {
                    dp[i][j] = 1 + (s[i] == s[j]);
                }
                else {
                    if(s[i] == s[j])
                        dp[i][j] = dp[i+1][j-1] + 2;
                    else
                        dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        return dp[0][N-1];
    }

    int longestPalindSubseqRec(vector<vector<int> >& dp, string& s, int i, int j) {
        if(i > j)
            return 0;
        if(i == j)
            return dp[i][j] = 1;
        if(dp[i][j] == -1) {
            if(s[i] == s[j])
                dp[i][j] = 2 + longestPalindSubseqRec(dp, s, i+1, j-1);
            else
                dp[i][j] = max(longestPalindSubseqRec(dp, s, i+1, j),
                               longestPalindSubseqRec(dp, s, i, j-1));
        }
        return dp[i][j];
    }
    
    int longestPalindSubseqRecDriver(string& s) {
        if(s.empty())
                return 0;
        const int N = s.size();
        vector<vector<int> > dp(N, vector<int>(N, -1)); 
        return longestPalindSubseqRec(dp, s, 0, N-1);
    }
    
    int longestPalindromeSubseq(string s) {
        return longestPalindSubseqRecDriver(s);
    }
};

3.2 Longest Palindromic Subsequence Java

class Solution {
    public int longestPalindromeSubseq(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];
    }
}

3.3 Longest Palindromic Subsequence JavaScript

var longestPalindromeSubseq = function(s) {
    const n = s.length;
    const dp = Array(n).fill().map(() => Array(n).fill(0));
    for (let i = n-1; i >= 0; i--) {
        dp[i][i] = 1;
        for (let j = i+1; j < n; j++) {
            if (s[i] === s[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];
};

3.4 Longest Palindromic Subsequence Python

class Solution(object):
    def longestPalindromeSubseq(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]

4. Time and Space Complexity

Time ComplexitySpace Complexity
C++O(n²)O(n²)
JavaO(n²)O(n²)
JavaScriptO(n²)O(n²)
PythonO(n²)O(n²)
  • The code uses the Palindromic Subsequence pattern with a Dynamic Programming approach.
  • The time complexity is O(n²) for all implementations due to the nested loops or recursive calls with memoization.
  • The space complexity is O(n²) for all implementations due to the 2D dp table.

Scroll to Top