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


题目描述

编辑距离(也称为Levenshtein距离) 是指两个字符串之间,由一个字符串转变成另一个字符串所需的最少单字符编辑操作次数。这些操作包括插入一个字符、删除一个字符或替换一个字符。

例如,将字符串 "kitten" 转换成 "sitting" 需要三个编辑操作:

  1. 将 'k' 替换为 's'
  2. 在 'i' 后面插入 't'
  3. 将 'e' 替换为 'g'

因此,"kitten" 和 "sitting" 的编辑距离为 3。

示例代码

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 示例

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 示例

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 编写。这些代码片段可以很好地应用于面试中,展示你对动态规划问题的理解和解决能力。

推荐面试题