- 最长回文序列( Longest Palindromic Subsequence)
回文序列:正向遍历与反向遍历都相同的序列(在原字符串中的位置不一定连续)
给定一个字符串,求其最长的回文序列的长度。例如,给定字符串是“BBABCBCAB”,则最长回文序列的长度为7,“BACBCAB”为其中一个最长回文序列。
用LPS(i,j)表示S[i, i + 1,···,j - 1, j]序列的最长回文序列的长度,则有
![这里写图片描述](https://img-blog.csdn.net/20150517104207530)
int LPS(string s, int i, int j)
{
if(i >= 0 && j >= 0)
{
if(i > j)
return 0;
if(i == j)
return 1;
if(s[i] == s[j])
return LPS(s, i + 1, j - 1) + 2;
else
{
if(LPS(s, i + 1, j) > LPS(s, i, j - 1))
return LPS(s, i + 1, j);
else
return LPS(s, i, j - 1);
}
}
return 0;
}
int LPS(string s)
{
int size = s.size();
if(size == 0)
return 0;
const int num = 100;
int tab[num][num] = {0};
for(int i = 0; i < size; ++i)
tab[i][i] = 1;
for(int j = 0; j < size - 1; ++j)
{
for(int k = 0; k < size - j - 1; ++k)
{
int row = k ;
int col = row + 1 + j;
if(s[row] == s[col])
tab[row][col] = tab[row + 1][col - 1] + 2;
else
{
if(tab[row][col - 1] > tab[row + 1][col])
tab[row][col] = tab[row][col - 1];
else
tab[row][col] = tab[row + 1][col];
}
}
}
return tab[0][size - 1];
}
- 最长公共子序列(Longest Common Subsequence)
公共子序列:两个给定字符串中,出现顺序相同的序列(位置不一定连续)
设有X = {x1, x2, x3,··· ,xm}, Y = {y1, y2, y3, ···,yn} 为给定的两个序列
![这里写图片描述](https://img-blog.csdn.net/20150517154736670)
int LCS(string str1, int end1, string str2, int end2)
{
if(end1 < 0 || end2 < 0)
return 0;
if(str1[end1] == str2[end2])
return LCS(str1, end1 - 1, str2, end2 - 1);
else
{
if(LCS(str1, end1 - 1, str2, end2) > LCS(str1, end1, str2, end2 - 1))
return LCS(str1, end1 - 1, str2, end2);
else
return LCS(str1, end1, str2, end2 - 1);
}
}