Edit Distance
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:
- Insert a character
- Delete a character
- Replace a character
Example
Given word1 = mart
and word2 = karma
, return 3
.
Think
- Two sequence DP
- Setup a 2-D array
memo[i][j]
means the edit distance betweenword1(1, i)
andword2(1, j)
on the current position.- When
word1[i] != word2[j]
, it need increase the distance, so the value ofmemo[i][j]
comes from the minimum ofmemo[i-1][j]
,memo[i][j-1]
ormemo[i-1][j-1]
then plus one. - Initialized value is
i
orj
whenword1(0,0)
orword2(0,0)
(memo[i][0]
ormemo[0][j]
) - The final output is
memo[word1.length][word2.length]
Solution
/**
* @param word1 & word2: Two string.
* @return: The minimum number of steps.
*/
public int minDistance(String A, String B) {
// write your code here
if(A == null || B == null)
return 0;
int[][] memo = new int[A.length()+1][B.length()+1];
for(int i = 0; i <= A.length(); i ++) {
for(int j = 0; j <= B.length(); j ++) {
if(i == 0 || j == 0)
memo[i][j] = (i == 0? (j == 0? 0 : j ): i);
else
memo[i][j] = (A.charAt(i-1) == B.charAt(j-1) ? memo[i-1][j-1] : Math.min(memo[i-1][j-1], Math.min(memo[i][j-1],memo[i-1][j])) + 1);
}
}
return memo[A.length()][B.length()];
}