Longest Palindromic Subsequence - Dynamic programming
Problem:
Given a sequence, find the length of the longest palindromic subsequence in it. For example, if the given sequence is “BBABCBCAB”, then the output should be 7 as “BABCBAB” is the longest palindromic subseuqnce in it.“BBBBB” and “BBCBB” are also palindromic subsequences of the given sequence, but not the longest ones.
Solution:
Given a sequence, find the length of the longest palindromic subsequence in it. For example, if the given sequence is “BBABCBCAB”, then the output should be 7 as “BABCBAB” is the longest palindromic subseuqnce in it.“BBBBB” and “BBCBB” are also palindromic subsequences of the given sequence, but not the longest ones.
Solution:
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; int L[][] = new int [n][n]; // Create a table to store results of subproblems // Strings of length 1 are palindrome of lentgh 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 // http://www.geeksforgeeks.org/archives/15553). 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 lnegth of the lps is " + lps(seq)); } } |
Comments
Post a Comment