您的位置:首页 > 编程语言 > C语言/C++

算法导论第十五章习题15.4-4c++代码实现

2012-08-10 15:50 393 查看
只用两行表c就能实现计算LCS长度的算法。因为在计算长度的时候c[i][j]只需要上一行以及本行的计数就能计算出结果,所以我们只用两行表c来实现。每当第二行的长度计算完成之后,便将第二行的长度赋给第一行,而第二行清0,这样计算下一行的时候,第一行就能使用上一层循环中的长度。代码如下:

#include<iostream>
#include<string>
using namespace std;
int LCS_Length(string x,string y)
{
	int m,n,i,j,k;
	m=x.length();
	n=y.length();
	//使y永远为最小的,n为最短的
	if(m<=n)
	{
		string temp;
		temp=x;
		x=y;
		y=temp;
		i=m;
		m=n;
		n=i;
	}
	int c[2][100]={0};
	for(i=1;i<=n;i++)
	{
		c[0][i]=0;
	}
	c[1][0]=0;
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(x[i-1]==y[j-1])
			{
				c[1][j]=c[0][j-1]+1;
			}
			else if(c[0][j]>=c[1][j-1])
			{
				c[1][j]=c[0][j];
			}
			else
			{
				c[1][j]=c[1][j-1];
			}
		}
		//将第二行的结果放到第一行中,而第二行赋值为0
		for(k=1;k<=n;k++)
		{
			c[0][k]=c[1][k];
			c[1][k]=0;
		}
	}
	return c[0]
;
}
int main()
{
	string x="abcbdab";
	string y="bdcaba";
	cout<<LCS_Length(x,y)<<endl;
	return 0;
}




但是该代码中仍然多了几个不必要的循环,从而增加了时间复杂度,下面对改代码进行简化:

#include<iostream>
#include<string>
using namespace std;

int LCS_LengthC(string x,string y)
{
	int m,n,i,j;
	bool flag=0;
	m=x.length();
	n=y.length();
	//使y永远为最小的,n为最短的
	if(m<=n)
	{
		string temp;
		temp=x;
		x=y;
		y=temp;
		i=m;
		m=n;
		n=i;
	}
	int c[2][10]={0};
	c[1][0]=0;
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(x[i-1]==y[j-1])
			{
					c[(int)!flag][j]=c[(int)flag][j-1]+1;
			}
			else if(c[(int)flag][j]>=c[(int)!flag][j-1])
			{
				c[(int)!flag][j]=c[(int)flag][j];
			}
			else
			{
				c[(int)!flag][j]=c[(int)!flag][j-1];
			}
		}
		flag=!flag;
		for(int k=1;k<=n;k++)
		{
			c[(int)!flag][k]=0;
		}
	}
	return c[(int)flag]
;
}
int main()
{
	string x="abcbdab";
	string y="bdcaba";
	cout<<LCS_LengthC(x,y)<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: