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!