C Program for Longest Palindromic Subsequence | DP-12
Last Updated :
28 Jun, 2022
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.
C
#include <stdio.h>
#include <string.h>
int max( int x, int y) { return (x > y) ? x : y; }
int lps( char * seq, int i, int j)
{
if (i == j)
return 1;
if (seq[i] == seq[j] && i + 1 == j)
return 2;
if (seq[i] == seq[j])
return lps(seq, i + 1, j - 1) + 2;
return max(lps(seq, i, j - 1), lps(seq, i + 1, j));
}
int main()
{
char seq[] = "GEEKSFORGEEKS" ;
int n = strlen (seq);
printf ( "The length of the LPS is %d" , lps(seq, 0, n - 1));
getchar ();
return 0;
}
|
Output:
The length of the LPS is 5
Dynamic Programming Solution
C
#include <stdio.h>
#include <string.h>
int max( int x, int y) { return (x > y) ? x : y; }
int lps( char * str)
{
int n = strlen (str);
int i, j, cl;
int L[n][n];
for (i = 0; i < n; i++)
L[i][i] = 1;
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];
}
int main()
{
char seq[] = "GEEKS FOR GEEKS" ;
int n = strlen (seq);
printf ( "The length of the LPS is %d" , lps(seq));
getchar ();
return 0;
}
|
Output
The length of the LPS is 7
Time Complexity: O(n2)
Auxiliary Space: O(n2)
Please refer complete article on Longest Palindromic Subsequence | DP-12 for more details!
Share your thoughts in the comments
Please Login to comment...