现在的位置: 首页 > 综合 > 正文

最长公共子串(LCS)

2013年12月09日 ⁄ 综合 ⁄ 共 1090字 ⁄ 字号 评论关闭
这篇文章不错
注意:
上面这个链接不是原创,
原创在
博客园那个排版比较好,但某些地方没有链接,图片也少了些
这篇貌似更详细一些

第一篇
不错
尤其是
把一维数组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
后面把左右串混来混去
改了一阵,干脆把参数名改为左右
总是改好了
代码规范重要啊

抱歉!评论已关闭.