Edit Distance
Problem Statement
Given two strings, find the minimum operations (insert, delete, replace) to transform one into the other. This hard-level DP brainteaser is a word wizard’s challenge—morph those strings!
Example
Input: word1 = "horse", word2 = "ros"
Output: 3 (horse→rose→ros)
Input: word1 = "intention", word2 = "execution"
Output: 5
Code
Java
Python
JavaScript
public class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length(), 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] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
}
}
}
return dp[m][n];
}
}
def min_distance(word1, word2):
m, n = len(word1), len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if word1[i-1] == word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
return dp[m][n]
function minDistance(word1, word2) {
let m = word1.length, n = word2.length;
let dp = Array(m + 1).fill().map(() => Array(n + 1).fill(0));
for (let i = 0; i <= m; i++) dp[i][0] = i;
for (let j = 0; j <= n; j++) dp[0][j] = j;
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (word1[i-1] === word2[j-1]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = Math.min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1;
}
}
}
return dp[m][n];
}
Explanation
- DP Insight: dp[i][j] = min operations for prefixes i,j.
- Flow: Match = no cost; mismatch = min of replace, delete, insert.
- Example: "horse","ros" → dp[5][3]=3.
Note
Time complexity: O(mn), Space complexity: O(mn). Transform with precision!
