当前位置: 面试刷题>> 编辑距离(经典算法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 编写。这些代码片段可以很好地应用于面试中,展示你对动态规划问题的理解和解决能力。