给定一个原串和目标串,能对源串进行如下操作:
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;
}