最长回文子序列
最长回文子序列是给定序列的一个子序列,且该子序列是回文的。
在本问题中,给出包含一组字符的序列,我们需要求出回文子序列的最长长度。
为了解决这个问题,我们可以使用递归公式:
如果 L (0, n-1) 用于存储最长回文子序列的长度,那么
L (0, n-1) := L (1, n-2) + 2(当第 0 和第 (n-1) 个字符相同时)。
输入和输出
Input: A string with different letters or symbols. Say the input is “ABCDEEAB” Output: The longest length of the largest palindromic subsequence. Here it is 4. ABCDEEAB. So the palindrome is AEEA.
算法
palSubSeqLen(str)
输入 − 给定的字符串。
输出 − 最长回文子序列的长度。
Begin n = length of the string create a table called lenTable of size n x n and fill with 1s for col := 2 to n, do for i := 0 to n – col, do j := i + col – 1 if str[i] = str[j] and col = 2, then lenTable[i, j] := 2 else if str[i] = str[j], then lenTable[i, j] := lenTable[i+1, j-1] + 2 else lenTable[i, j] := maximum of lenTable[i, j-1] and lenTable[i+1, j] done done return lenTable[0, n-1] End
示例
#include<iostream>
using namespace std;
int max (int x, int y) {
return (x > y)? x : y;
}
int palSubseqLen(string str) {
int n = str.size();
int lenTable[n][n]; // Create a table to store results of subproblems
for (int i = 0; i < n; i++)
lenTable[i][i] = 1; //when string length is 1, it is palindrome
for (int col=2; col<=n; col++) {
for (int i=0; i<n-col+1; i++) {
int j = i+col-1;
if (str[i] == str[j] && col == 2)
lenTable[i][j] = 2;
else if (str[i] == str[j])
lenTable[i][j] = lenTable[i+1][j-1] + 2;
else
lenTable[i][j] = max(lenTable[i][j-1], lenTable[i+1][j]);
}
}
return lenTable[0][n-1];
}
int main() {
string sequence = "ABCDEEAB";
int n = sequence.size();
cout << "The length of the longest palindrome subsequence is: " << palSubseqLen(sequence);
}输出
The length of the longest palindrome subsequence is: 4
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP