编辑距离(一)
题目链接:编辑距离(一)
编辑距离:是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。
操作有三种:插入,删除,修改(修改其实就是替换)
我们可以转换成子问题:str1的前 i 个字符转换成str2的前 j 个字符的编辑距离
因为有两个字符串,从str1的一个字符开始转化成str2的子串,所以我们需要二维数组
状态:F[ i ][ j ]:从str1的前 i 个字符转换成str2 的前 j 字符所需的编辑距离
状态转移方程:分为3个可能
- 插入:F[ i ][ j ] = F[ i ][ j - 1]
- 删除:F[ i ][ j ] = F[ i - 1 ][ j ]
- 替换:F[ i ][ j ] = F[ i - 1 ][ j - 1 ]
下面通过一张图解释状态转移方程
代码如下:
int editDistance(string str1, string str2)
{
//行数
int row=str1.size();
//列数
int col=str2.size();
vector<vector<int>> dp(row+1,vector<int>(col+1));
//列初始化
for(int i=0;i<=col;++i)
dp[0][i]=i;
//行初始化
for(int j=1;j<=row;++j)
dp[j][0]=j;
for(int i=1;i<=row;++i)
{
for(int j=1;j<=col;++j)
{
//先比较插入,删除哪个操作次数更少
dp[i][j]=min(dp[i][j-1],dp[i-1][j])+1;
//再比较替换是否操作更少
//相等,不需要替换
if(str1[i-1]==str2[j-1])
dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
else
dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);//需要替换
}
}
return dp[row][col];
}