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