# Java Program for Longest Palindromic Subsequence | DP-12

Given a sequence, find the length of the longest palindromic subsequence in it.

As another example, if the given sequence is “BBABCBCAB”, then the output should be 7 as “BABCBAB” is the longest palindromic subsequence in it. “BBBBB” and “BBCBB” are also palindromic subsequences of the given sequence, but not the longest ones.

**1) Optimal Substructure: **

Let X[0..n-1] be the input sequence of length n and L(0, n-1) be the length of the longest palindromic subsequence of X[0..n-1].

If last and first characters of X are same, then L(0, n-1) = L(1, n-2) + 2.

Else L(0, n-1) = MAX (L(1, n-1), L(0, n-2)).

Following is a general recursive solution with all cases handled.

## Java

`// Java program of above approach` `class` `GFG {` ` ` `// A utility function to get max of two integers` ` ` `static` `int` `max(` `int` `x, ` `int` `y)` ` ` `{` ` ` `return` `(x > y) ? x : y;` ` ` `}` ` ` `// Returns the length of the longest palindromic subsequence in seq` ` ` `static` `int` `lps(` `char` `seq[], ` `int` `i, ` `int` `j)` ` ` `{` ` ` `// Base Case 1: If there is only 1 character` ` ` `if` `(i == j) {` ` ` `return` `1` `;` ` ` `}` ` ` `// Base Case 2: If there are only 2 characters and both are same` ` ` `if` `(seq[i] == seq[j] && i + ` `1` `== j) {` ` ` `return` `2` `;` ` ` `}` ` ` `// If the first and last characters match` ` ` `if` `(seq[i] == seq[j]) {` ` ` `return` `lps(seq, i + ` `1` `, j - ` `1` `) + ` `2` `;` ` ` `}` ` ` `// If the first and last characters do not match` ` ` `return` `max(lps(seq, i, j - ` `1` `), lps(seq, i + ` `1` `, j));` ` ` `}` ` ` `/* Driver program to test above function */` ` ` `public` `static` `void` `main(String[] args)` ` ` `{` ` ` `String seq = ` `"GEEKSFORGEEKS"` `;` ` ` `int` `n = seq.length();` ` ` `System.out.printf(` `"The length of the LPS is %d"` `,` ` ` `lps(seq.toCharArray(), ` `0` `, n - ` `1` `));` ` ` `}` `}` |

**Output:**

The length of the LPS is 5

**Dynamic Programming Solution**

## Java

`// A Dynamic Programming based Java` `// Program for the Egg Dropping Puzzle` `class` `LPS {` ` ` `// A utility function to get max of two integers` ` ` `static` `int` `max(` `int` `x, ` `int` `y) { ` `return` `(x > y) ? x : y; }` ` ` `// Returns the length of the longest` ` ` `// palindromic subsequence in seq` ` ` `static` `int` `lps(String seq)` ` ` `{` ` ` `int` `n = seq.length();` ` ` `int` `i, j, cl;` ` ` `// Create a table to store results of subproblems` ` ` `int` `L[][] = ` `new` `int` `[n][n];` ` ` `// Strings of length 1 are palindrome of length 1` ` ` `for` `(i = ` `0` `; i < n; i++)` ` ` `L[i][i] = ` `1` `;` ` ` `// Build the table. Note that the lower` ` ` `// diagonal values of table are` ` ` `// useless and not filled in the process.` ` ` `// The values are filled in a manner similar` ` ` `// to Matrix Chain Multiplication DP solution (See` ` ` `// https:// www.geeksforgeeks.org/matrix-chain-multiplication-dp-8/).` ` ` `// cl is length of substring` ` ` `for` `(cl = ` `2` `; cl <= n; cl++) {` ` ` `for` `(i = ` `0` `; i < n - cl + ` `1` `; i++) {` ` ` `j = i + cl - ` `1` `;` ` ` `if` `(seq.charAt(i) == seq.charAt(j) && cl == ` `2` `)` ` ` `L[i][j] = ` `2` `;` ` ` `else` `if` `(seq.charAt(i) == seq.charAt(j))` ` ` `L[i][j] = L[i + ` `1` `][j - ` `1` `] + ` `2` `;` ` ` `else` ` ` `L[i][j] = max(L[i][j - ` `1` `], L[i + ` `1` `][j]);` ` ` `}` ` ` `}` ` ` `return` `L[` `0` `][n - ` `1` `];` ` ` `}` ` ` `/* Driver program to test above functions */` ` ` `public` `static` `void` `main(String args[])` ` ` `{` ` ` `String seq = ` `"GEEKSFORGEEKS"` `;` ` ` `int` `n = seq.length();` ` ` `System.out.println(` `"The length of the lps is "` `+ lps(seq));` ` ` `}` `}` `/* This code is contributed by Rajat Mishra */` |

**Output**

The length of the lps is 5

Please refer complete article on Longest Palindromic Subsequence | DP-12 for more details!