根据自己思路写的最长公共子序列,稍微修改一下就行了
static int getlastPos(char *s,char c,int pos)
{
int len=strlen(s),i;
for(i=pos-1;i>=0;i--)
{
if(c==s[i])
return i;
}
return i;
}
static int** initM(char *x,char *y)
{
int xlen=strlen(x);
int ylen=strlen(y);
int i,j;
//m[i][0]:对x[i]之后的字符逐个进行比较,求出目前以x[i]开头最长子串的长度,存储在m[i][1]。
//并找到x[i]最靠近y尾部的位置(但保证现在的子串以x[i]开头,即x[i]的位置比目前子串后面的字符在y中位置靠前),存储在m[i][0]
//m[i][1]:以x[i]开头的最长子串长度
//m[i][2]:以x[i]开头的最长子串下一个字符位置
int **m=(int **)malloc(xlen*sizeof(int*));
for(i=0;i<xlen;i++)
{
m[i]=(int*)malloc(3*sizeof(int));
}
for(i=0;i<xlen;i++)
{
m[i][0]=m[i][1]=0;
m[i][2]=xlen;
}
for(i=xlen-1;i>=0;i--)
{
m[i][0]=getlastPos(y,x[i],ylen);
if(m[i][0]!=-1)
m[i][1]=1;
else
m[i][1]=0;
for(j=i+1;j<xlen;j++)
{
int pos=getlastPos(y,x[i],m[j][0]);
//保证单调递增
if(x[i]<y[j] && pos>=0 && m[j][1]+1>m[i][1])
{
m[i][0]=pos;
m[i][1]=m[j][1]+1;
m[i][2]=j;
}
}
}
return m;
}
static void printResult(int **m,int xlen,int max,char* x)
{
int i,j;
for(i=0;i<xlen;i++)
{
if(m[i][1]==max)
break;
}
while(i<xlen)
{
printf("%c ",x[i]);
i=m[i][2];
}
printf("\n");
}
本文介绍了一种求解最长公共子序列问题的算法实现,通过静态函数`getlastPos`定位字符在字符串中的最后出现位置,并利用`initM`函数初始化矩阵来记录最长子串的相关信息。

1573

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



