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.
Dynamic Programming Solution
<?php // A Dynamic Programming based // PHP program for LPS problem // Returns the length of the // longest palindromic // subsequence in seq // A utility function to get // max of two integers // function max( $x, $y) // { return ($x > $y)? $x : $y; } // Returns the length of the // longest palindromic // subsequence in seq function lps( $str )
{ $n = strlen ( $str );
$i ; $j ; $cl ;
// Create a table to store // results of subproblems $L [][] = array ( array ());
// 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
// cl is length of substring
for ( $cl = 2; $cl <= $n ; $cl ++)
{
for ( $i = 0; $i < $n - $cl + 1; $i ++)
{
$j = $i + $cl - 1;
if ( $str [ $i ] == $str [ $j ] &&
$cl == 2)
$L [ $i ][ $j ] = 2;
else if ( $str [ $i ] == $str [ $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 Code $seq = 'GEEKS FOR GEEKS' ;
$n = strlen ( $seq );
echo "The length of the " .
"LPS is " , lps( $seq );
// This code is contributed // by shiv_bhakt. ?> |
The length of the LPS is 7
Please refer complete article on Longest Palindromic Subsequence | DP-12 for more details!