65,176
社区成员




#include <iostream>
#include <string>
using namespace std;
void printLCS(char* a,int maxLen,int maxIndex)
{
char* begin=a+maxIndex-maxLen+1;
for(int i=0;i<maxLen;i++)
{
cout<<*begin;
++begin;
}
}
void LCS(char* a,int alen,char* b,int blen)//动态规划解法,O(n^2)
{
int* n=new int[alen];//记录匹配的数组
for(int k=0;k<alen;k++)
n[k]=0;//初始化
int maxIndex=0;//记录最大公共子串的最后位置,这里只纪录一个最长公共子串
int maxLen=0;//记录最大公共子串长度
for(int j=0;j<blen;j++)
{
int i;
for(i=alen-1;i>0;i--)//这里必须从后往前遍历,不然会丢掉先前的记录
{
if(a[i]==b[j])
{
n[i]=n[i-1]+1;
if(maxLen<n[i])
{
maxLen=n[i];
maxIndex=i;
}
}
else
n[i]=0;
}
if(a[i]==b[j])//处理i=0的情况
n[i]=1;
}
delete [] n;
printLCS(a,maxLen,maxIndex);
}
int main()
{
char* a="adbccadebbca";
char* b="edabccadece";
LCS(a,strlen(a),b,strlen(b));
system("pause");
}
int main()
{
char a[] = "adbccadebbca", b[] = "edabccadece";
char c[100] = {0};
int iMax = 0;
size_t ia = strlen(a), ib = strlen(b);
for (size_t i = 0; i<ia; i++)
{
char *pa = a+i;
for (size_t j = 0; j<ib; j++)
{
char *pb = b+j;
int m = 0;
int bcompare = strncmp(pa, pb, 1);
while (!bcompare)
{
m++;
if (m+j>=ib)
{
break;
}
bcompare = strncmp(pa+m, pb+m, 1);
}
if (m>iMax)
{
memset(c, 0, 100);
strncpy(c, pa, m);
cout<<c<<endl;
iMax = m;
}
j+=m;
}
}
cout<<c<<endl;
cout<<iMax<<endl;
system("pause");
}