在前一篇文章中给出了最大连续子序列的实现
本文主要是算法导论中的不连续的最大子序列算法的一种实现。
输入:字符串str1和str2
输出:最大不连续子序列以及子序列的长度
#include <iostream>
#include<string>
using namespace std;
template<class T>
inline T max(T a, T b)
...{
return a>b? a:b;
}
int LookUp(string str1,string str2, int i, int j, int** c)
...{
if(c[i][j]>-1)
return c[i][j];
if(!(i&&j))
c[i][j]=0;
else
if(str1[i]==str2[j])
c[i][j]=LookUp(str1,str2,i-1,j-1,c)+1;
else
c[i][j]=max(LookUp(str1,str2,i,j-1,c),LookUp(str1,str2,i-1,j,c));
return c[i][j];
}
void print_LCS(string str1, string str2,int** c, int i, int j)
...{
if(i==-1||j==-1)
return;
if(str1[i]==str2[j])
...{
print_LCS(str1, str2, c, i-1, j-1);
cout<<str1[i]<<" "<<ends;
if(i==str1.size()-1)
cout<<endl;
}
else
if(c[i-1][j]>c[i][j-1])
print_LCS(str1, str2, c, i-1, j);
else
print_LCS(str1, str2, c, i, j-1);
}
int LCS_length(string str1, string str2)
...{
int m=str1.size()+1;
int n=str2.size()+1;
int** c=new int* [m];
int i,j;
for(i=0;i<m;++i)
c[i]=new int[n];
for(i=0;i<m;++i)
for(j=0;j<n;++j)
c[i][j]=-1;


int len=LookUp(str1,str2,m-1,n-1,c);

/**//* for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
cout<<c[i][j]<<" "<<ends;
cout<<endl;
}
*/
print_LCS(str1,str2,c,m-1,n-1);
for(i=0;i<m;++i)
delete[] c[i];
delete[] c;
return len;
}
int main()
...{
string str1("10010101");
string str2("010110110");
cout<<"str1:"<<str1<<endl;
cout<<"str2:"<<str2<<endl;
cout<<LCS_length(str1,str2)<<endl;
return 0;
}

输出结果:
str1:10010101
str2:010110110
010101
6
本文介绍了一种求解不连续最大子序列问题的算法实现,通过递归方式寻找两个字符串中的最大不连续子序列及其长度,并展示了具体的C++代码实现。
1万+

被折叠的 条评论
为什么被折叠?



