Google编程题:最小操作数

给定一个原串和目标串,能对源串进行如下操作: 
1.在给定位置插入一个字符 
2.替换任意字符 
3.删除任意字符 要求完成一下函数,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于2000。

动态创建的了二维指针数组,要记得释放。
int cal_distance( string source, string target)
{
	if(source.size()==0)
		return target.size();
	if (target.size()==0)
		return source.size();
	//if (source.size()==0||target.size()==0)
	//	return 0;
	int len_src=source.size();
	int len_trg=target.size();
	int **f;
	f=new int*[len_src+1];
	for (int i=0;i<=len_src;i++)
	{
		f[i]=new int [len_trg+1];
	}

	//这里纯用于测试
	for (int i=0;i<len_src+1;++i) 
		f[i][0]=i;				
	for (int i=0;i<len_trg+1;++i) 
		f[0][i]=i;				
	int temp = 0;
	for (int j=0;j<len_trg;++j)	
	{
		for (int i=0;i<len_src;++i)	
		{
			if(source[i]==target[j])
				f[i+1][j+1]=f[i][j];
			else
			{
				temp = min(f[i][j]+1,f[i][j+1]+1);
				f[i+1][j+1]=min(f[i+1][j]+1,temp);
			}
			//cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
		}
	}
	int steps=f[len_src][len_trg];
	for (int i=0;i<=len_src;i++)
	{
		delete[]f[i];
	}
	delete[]f;
	return steps;

}
int main()
{
	string source,target;
	cin>>source>>target;
	int steps=cal_distance(source,target);
	cout<<steps;
	return 0;
}


原文地址:https://www.cnblogs.com/fushuixin/p/7413205.html