算法导论 练习题 15.4-5

本文介绍了一种求解最长公共子序列问题的算法实现,通过静态函数`getlastPos`定位字符在字符串中的最后出现位置,并利用`initM`函数初始化矩阵来记录最长子串的相关信息。

根据自己思路写的最长公共子序列,稍微修改一下就行了

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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值