当前位置: 面试刷题>> 编辑距离(经典算法150题)


### 题目描述 **编辑距离(也称为Levenshtein距离)** 是指两个字符串之间,由一个字符串转变成另一个字符串所需的最少单字符编辑操作次数。这些操作包括插入一个字符、删除一个字符或替换一个字符。 例如,将字符串 "kitten" 转换成 "sitting" 需要三个编辑操作: 1. 将 'k' 替换为 's' 2. 在 'i' 后面插入 't' 3. 将 'e' 替换为 'g' 因此,"kitten" 和 "sitting" 的编辑距离为 3。 ### 示例代码 #### PHP 示例 ```php function editDistance($word1, $word2) { $m = strlen($word1); $n = strlen($word2); // 创建一个二维数组来保存中间结果 $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); // 初始化边界条件 for ($i = 0; $i <= $m; $i++) { $dp[$i][0] = $i; } for ($j = 0; $j <= $n; $j++) { $dp[0][$j] = $j; } // 动态规划填表 for ($i = 1; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { if ($word1[$i - 1] == $word2[$j - 1]) { $dp[$i][$j] = $dp[$i - 1][$j - 1]; } else { $dp[$i][$j] = 1 + min($dp[$i - 1][$j], // 插入 $dp[$i][$j - 1], // 删除 $dp[$i - 1][$j - 1]); // 替换 } } } return $dp[$m][$n]; } echo editDistance("kitten", "sitting"); // 输出: 3 ``` #### Python 示例 ```python def edit_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] = 1 + min(dp[i - 1][j], # 插入 dp[i][j - 1], # 删除 dp[i - 1][j - 1]) # 替换 return dp[m][n] print(edit_distance("kitten", "sitting")) # 输出: 3 ``` #### JavaScript 示例 ```javascript function editDistance(word1, word2) { const m = word1.length; const n = word2.length; const dp = Array.from({ length: m + 1 }, () => 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] = 1 + Math.min(dp[i - 1][j], // 插入 dp[i][j - 1], // 删除 dp[i - 1][j - 1]); // 替换 } } } return dp[m][n]; } console.log(editDistance("kitten", "sitting")); // 输出: 3 ``` 以上代码示例均实现了编辑距离的计算,并分别用 PHP、Python 和 JavaScript 编写。这些代码片段可以很好地应用于面试中,展示你对动态规划问题的理解和解决能力。
推荐面试题