编辑距离_牛客题霸_牛客网
描述
给定两个单词word1和word2,请计算将word1转换为word2至少需要多少步操作。
你可以对一个单词执行以下3种操作:
a)在单词中插入一个字符
b)删除单词中的一个字符
c)替换单词中的一个字符
示例1
输入:"b",""
返回值:1
示例2
输入:"ab","bc"
返回值:2
题解:
给出俩个单词字符串通过三种操作来选择一个最小操作数完成word1转换为Word2
状态选取:F(i,j) 表示由word1中前i个字母 转换成word2中前j个字母的最下操作次数
因为俩个单词的长度不同,我们需要通过修改word1单词,可以利用背包思想,通过word1中前i个字母来表示word2中前j个字母,下图中左侧横坐标就是word1中的前i个字母,
状态转移方程:F(i,j) = min(插入、删除、替换)
min(F(i,j-1)+1, F(i-1,j)+1, F(i-1,j-1) + W1[i]==W2[j] ? 0 : 1)
需要由这第i项转换为右上方的第j项
首先初始化第一行,用空串来转换为word2对应的前j个单词,最小的操作次数仅需仅需进行插入即可
同理实现第一列,用word1前i项实现转换为空串,最小的操作次数仅需进行删除操作
实现第二行,用字母a来转换为word2的前1项“h”
可以通过F(1,0) 得来的 空串“”来进行一次插入即可得到h
也可以通过F(0,1)得到的 ha 一次删除得到h
也可以通过F(0,0) 得到将 “ ” 替换为h
用word1前1项a来实现Word2前2项“he”
通过F(1,1)得到的 h 进行一次插入e操作得到 he
通过a位置插入he 然后进行删除a得到 he
通过F(0,1) 得到ha 替换 a得到 he
源码:
首先初始化二维矩阵,然后通过min函数选择(插入操作、删除操作、替换或不替换)之间的最小值.
int minDistance(string word1, string word2) {
// write code here
int row = word1.size();
int col = word2.size();
vector<vector<int>> res(row+1, vector<int> (col+1));
for(int j = 0; j <= col; j++)
res[0][j] = j;
for(int i = 1; i <= row; i++)
res[i][0] = i;
for(int i = 1; i <= row; i++)
{
for(int j = 1; j <= col; j++)
{
// 插入删除
res[i][j] = min(res[i-1][j], res[i][j-1])+1;
if(word1[i-1] == word2[j-1])
res[i][j] = min(res[i][j], res[i-1][j-1]);
else
// 只有当俩项不相同情况下才进行替换
res[i][j] = min(res[i][j], res[i-1][j-1]+1);
}
}
return res[row][col];
}