71.Edit Distance (edit distance)

Level:

  Hard

Subject description:

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

You have the following 3 operations permitted on a word:

  1. Insert a character
  2. Delete a character
  3. 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')

Analysis of ideas:

  Dynamic programming ideas, dp [i] [j] representatives will be converted into a number of operations before word2 j characters needed word1 before i characters.

  If word1 [i] == word2 [j], then dp [i] [j] = dp [i-1] [j-1].

  If word1 [i] is not equal to word2 [j], find the need to insert elements, delete elements, the smallest element replacement operation, then add a.

  dp [i] [j-1] represents a front word1 i may represent a front word2 j-1, then to a first j represents only insert operation.

  dp [i-1] [j] denotes a front word1 i-1 can represent a word2 before the j, then the first one to represent the j before i can only perform the removal.

  dp [i-1] [j-1] represents a front word1 i-1 may represent a front word2 j-1, then the first to the j denotes the i-th former, only replace operation is performed.

  则dp[i] [j]=min(dp[i-1] [j],dp[i] [j],dp[i-1] [j-1])+1;

Code:

public class Solution{
    public int minDistance(String word1,String word2){
        int m=word1.length();
        int n=word2.length();
        int [][]dp=new int [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=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(word1.charAt(i)==word2.charAt(j)){
                    dp[i+1][j+1]=dp[i][j];
                }else{
                    dp[i+1][j+1]=Math.min(dp[i+1][j],Math.min(dp[i][j+1],dp[i][j]))+1;
                }
            }
        }
        return dp[m][n];
    }
}

Guess you like

Origin www.cnblogs.com/yjxyy/p/11098060.html