leetcode 72 编辑距离(Edit_distance) 经典dp
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
-
插入一个字符
-
删除一个字符
-
替换一个字符
思路:动态规划
m n分别表示word1和word2的长度
定义数组dp[m+1][n+1],dp[i][j]表示字符串1的前i和字符串2的前j个字符转换的最小操作数。
两种情况
如果word1[i-1]==word2[j-1],即word1的第i个字符和word2的第j个字符相等,dp[i][j]=dp[i-1][j-1]。
如果word1[i-1]!=word2[j-1],下面三种情况取最小
插入:dp[i][j]=dp[i][j-1]+1(这个是化简出来的,过后我会在后面推导过程)
删除:dp[i][j]=dp[i-1][j]+1
替换:dp[i][j]=dp[i-1][j-1]+1
举个栗子
输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

比如说要计算dp[3][2],也就是hor->ro最小编辑距离
首先判断o!=r,需要求三种操作的最小
删除:删除r得ho->ro也就是dp[i-1][j]+1
替换:将最后一个r替换为o即,然后求dp[i-1][j-1],加上当前这一步dp[i-1][j-1]+1
插入:插入o得到horo->ro化简为hor->r,即求dp[i][j-1],同理加上当前这一步dp[i][j-1]+1
class Solution {
public:
int minDistance(string word1, string word2) {
int m=word1.length();
int n=word2.length();
int dp[m+1][n+1]{};
for(int i=0;i<=m;i++)dp[i][0]=i;
for(int i=0;i<=n;i++)dp[0][i]=i;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(word1[i-1]==word2[j-1])dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i][j-1]+1,min(dp[i-1][j]+1,dp[i-1][j-1]+1));
}
return dp[m][n];
}
};

浙公网安备 33010602011771号