Skip to main content

72 Edit Distance

Leetcode

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.

You have the following three operations permitted on a word:

Insert a character
Delete a character
Replace a character

Example 1:

Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse (replace 'h' with 'r')
rorse -> rose (remove 'r')
rose -> ros (remove 'e')

Example 2:

Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation:
intention -> inention (remove 't')
inention -> enention (replace 'i' with 'e')
enention -> exention (replace 'n' with 'x')
exention -> exection (replace 'n' with 'c')
exection -> execution (insert 'u')


dp[i][j] 表示 word1 前 i 个字母变成 word2 需要改变的字符数,遍历 dp ,如果 word1.charAt(i-1)==word2.charAt(j-1),word1 前 i 个字符和 word2 前 j 个字符需要变换的次数和 dp[i-1][j-1] 相同,否则可以新增、删除、更改一个字符达到 word1 前 i 个字符和 word2 前 j 个字符相同,为 dp[i-1][j-1],dp[i][j-1],dp[i-1][j] 三者最小的加一。

class Solution {
public int minDistance(String word1, String word2) {
int len1=word1.length(), len2=word2.length();
int[][] dp=new int[len1+1][len2+1];
for(int i=1;i<=len1;++i){
dp[i][0]=i;
}
for(int i=1;i<=len2;++i){
dp[0][i]=i;
}
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j){
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
} else {
dp[i][j]=1+min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]);
}
}
}
return dp[len1][len2];
}

private int min(int i1, int i2, int i3){
if(i1<i2){
if(i1<i3) return i1;
return i3;
} else {
if(i2<i3) return i2;
return i3;
}
}
}