Description:
题目来源:https://leetcode-cn.com/problems/edit-distance/
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
Answer:
我们假设 f ( i , j ) f(i,j) f(i,j)表示前缀为 i i i的单词,与前缀为 j j j的单词进行匹配,所需要的最少的操作数。
匹配肯定是一个一个字符的进行匹配,无非就两种情况。当字符相同的时候,怎么处理;当字符不同的时候怎么处理。
- 当字符相同的时候,相当于直接去掉这两个字符,直接比较前面,如下:
- 当字符不同的时候,由3种处理方式,插入、替换和删除。
- 插入
插入一个相同的字符,然后直接一块去掉就可以,相当于只比较前面的。
- 替换
- 删除
这三种情况取最小值就可以了。
AC代码如下:
class Solution {
public:
int minDistance(string word1, string word2) {
int len1 = word1.length();
int len2 = word2.length();
int dp[len1+1][len2+1];
//初始化
for(int i=0; i<=len1; i++){
for(int j=0; j<=len2; j++){
if(i==0){
dp[0][j] = j;
}else if(j==0){
dp[i][0] = i;
}else{
dp[i][j]=0;
}
}
}
//字符串要从0开始遍历
for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){
if(word1[i] == word2[j]){
dp[i+1][j+1] = dp[i][j];
}else{
dp[i+1][j+1] = min(dp[i+1][j],min(dp[i][j+1],dp[i][j])) + 1;
}
}
}
return dp[len1][len2];
}
};