最长公共子串(LCS)

这篇文章不错
注意:
上面这个链接不是原创,
原创在
博客园那个排版比较好,但某些地方没有链接,图片也少了些

这篇貌似更详细一些

第一篇
不错
尤其是
把一维数组c[]当二维数组来用
这个很巧妙,
程序更简洁
而且没有影响可读性
自己实现了下

把一维数组c[]当二维数组来用
其实是在形成矩阵时,先形成最左边的一列,然后依次生成右边的列
所以对串2是从尾部开始遍历,因为这样才能利用
本来在矩阵中位于左上角的元素
真是巧妙啊

char *LCS(char left[], char right[])
{
	int start,end, len;
	int rightLen = strlen(right);
	int leftLen = strlen(left);

	int *c = new int[rightLen];
	int i,j;

	end = len = 0;
	for(i = 0; i < leftLen; i++)
	{
		for(j = rightLen-1; j >= 0; j--)
		{
			if(left[i] == right[j])
			{
				if(i == 0 || j == 0)
					c[j] = 1;
				else
					c[j] = c[j-1]+1;
			}
			else
				c[j] = 0;

			if(c[j] > len)
			{
				len = c[j];
				end = j;
			}
		}
	}

	start = end-len+1;
	char *p = new char[len+1];
	for(i = 0; i < len; i++)
		p[i] = right[start++];
	p[i] = '\0';

	return p;
}
void main()
{
	char str1[M] = "banana";//"21232523311324";
	char str2[M] = "bnanc";//312123223445";
	//printf("请输入字符串1:");

	//gets(str1);
	//	printf("请输入字符串2:");

	//gets(str2);
	//printf("最长子串为:");

	char *p = LCS(str1,str2);
	printf("%s\n",p);

	delete[] p;
}

在实现的时候遇到没有一次编写成功
主要是一开始把两个参数命名为a,b
后面把左右串混来混去
改了一阵,干脆把参数名改为左右
总是改好了

代码规范重要啊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值