Friday, January 9, 2015

Edit Distance (LeetCode String)

Question: Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character

Idea: Dynamic programming. Let dp[i][j] stand for the edit distance between word1[0...i] and word2[0...j]. Then if word1[i]==word2[j], dp[i][j]=dp[i-1][j-1], since no need to change anything; if word1[i]!=word2[j], then dp[i][j] can has three sources: dp[i-1][j-1] (by replace), dp[i][j-1] by add one letter to word2[0...j-1], or dp[i-1][j] by add one letter to word1[0...i-1]. So dp[i][j]=1+minOfThree(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]).

Time: O(n^2) Space: O(n^2)

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 j=0;j<=n;j++)  
       dp[0][j]=j;  
     for(int i=1;i<=m;i++)  
     {  
       for(int j=1;j<=n;j++)  
       {  
         if(word1.charAt(i-1)==word2.charAt(j-1))  
         {  
           dp[i][j]=dp[i-1][j-1];  
         }  
         else  
         {  
           dp[i][j]=1+minOfThree(dp[i-1][j],dp[i-1][j-1],dp[i][j-1]);  
         }  
       }  
     }  
     return dp[m][n];  
   }  
   public int minOfThree(int a, int b, int c)  
   {  
     return Math.min(Math.min(a,b),c);  
   }  
 }  

No comments:

Post a Comment