给定一个序列,找到其中最长回文子序列的长度。
作为另一个示例,如果给定序列为“ BBABCBCAB”,则输出应为7,因为“ BABCBAB”是其中最长的回文序列。 “ BBBBB”和“ BBCBB”也是给定序列的回文序列,但不是最长的。
1)最佳子结构:
令X [0..n-1]为长度n的输入序列,L(0,n-1)为X [0..n-1]的最长回文子序列的长度。
如果X的最后一个字符和第一个字符相同,则L(0,n-1)= L(1,n-2)+ 2。
否则L(0,n-1)= MAX(L(1,n-1),L(0,n-2))。
以下是处理所有情况的通用递归解决方案。
C
// C program of above approach
#include
#include
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
// Returns the length of the longest palindromic subsequence in seq
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 functions */
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;
}
C++
// A Dynamic Programming based C++ program for LPS problem
// Returns the length of the longest palindromic subsequence in seq
#include
#include
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
// Returns the length of the longest palindromic subsequence in seq
int lps(char* str)
{
int n = strlen(str);
int i, j, cl;
int L[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
// 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 (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 program to test above functions */
int main()
{
char seq[] = "GEEKS FOR GEEKS";
int n = strlen(seq);
printf("The lnegth of the LPS is %d", lps(seq));
getchar();
return 0;
}
输出:
The length of the LPS is 5
动态编程解决方案
C++
// A Dynamic Programming based C++ program for LPS problem
// Returns the length of the longest palindromic subsequence in seq
#include
#include
// A utility function to get max of two integers
int max(int x, int y) { return (x > y) ? x : y; }
// Returns the length of the longest palindromic subsequence in seq
int lps(char* str)
{
int n = strlen(str);
int i, j, cl;
int L[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
// 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 (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 program to test above functions */
int main()
{
char seq[] = "GEEKS FOR GEEKS";
int n = strlen(seq);
printf("The lnegth of the LPS is %d", lps(seq));
getchar();
return 0;
}
输出:
The lnegth of the LPS is 7
请参阅有关最长回文序列的完整文章| DP-12了解更多详情!
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。