把一个单词增删改一个字符变为另外一个单词的最少操作次数。一次操作包含增加、减少、修改一个字符
举例:abcde变为acfgh最短编辑距离为4
思路: 动态规划题目
思路: 动态规划题目
1、dp
[
i
][j]
表示第一个串前
i
个字符和第
2
个串前
j
个字符的最短编辑距离。
2、边界
dp
[0][j]= j
dp
[
i
][0] =
i
3、递推
dp
[
i
][j]
可能是
dp
[
i
– 1][j]
+
1
,
删去第
i
个字符
dp
[
i
][j – 1]
+
1
在第
(
i
+ 1)
个位置增加一个字符
dp
[i-1][j-1]
+
1 / 0
,这取决于第一个串的第
i
个和第二个串的第
j
个字符是否匹配,匹配则不修改(+
0
),不匹配表示修改第
i
个字符(
+1)
#include <iostream.h>
#include<malloc.h>
int min(int one,int two)
{
if(one>two)
return two;
else
return one;
}
void main()
{
char cho[]="abcde",cht[]="acfghc";
int leno=sizeof(cho)-1,lent=sizeof(cht)-1;
int **dp=(int **)malloc(sizeof(int)*(leno+1));
for(int i=0;i<leno+1;++i)
dp[i]=(int *)malloc(sizeof(int)*(lent+1));
for(i=0;i<=leno;++i)
dp[i][0]=i;
for(i=0;i<=lent;++i)
dp[0][i]=i;
for(i=1;i<=leno;++i)
{
for(int j=1;j<=lent;++j)
{
if(cho[i-1]==cht[j-1])
dp[i][j]=dp[i-1][j-1]; // 不需要编辑
else
{
int one=dp[i][j-1]+1; //j中插入字符
int two=dp[i-1][j]+1; //j中删除字符
int three=dp[i-1][j-1]+1; //j中替换字符
dp[i][j]=min(min(one,two),three);
}
}
}
cout<<dp[leno][lent]<<endl;
}