返回

理解 LeetCode 第 72 题:编辑距离的精髓

IOS

算法奇旅:从理解 LeetCode 第 72 题编辑距离到算法世界的大门

导言

LeetCode 第 72 题:编辑距离是算法世界中一颗璀璨的明珠,它考验着求解者对字符串操作和动态规划的深刻理解。编辑距离算法广泛应用于拼写检查、自然语言处理和生物信息学等领域,掌握其精髓将为你的算法技能锦上添花。

问题陈述

给定两个字符串 word1 和 word2,编辑距离定义为将 word1 转变为 word2 所需的最少编辑操作数,其中编辑操作包括插入、删除或替换单个字符。

动态规划:破解编辑距离的利刃

动态规划是一种将复杂问题分解为更小、易于解决的子问题的强大范式。对于编辑距离算法,我们可以构建一个二维表 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最小编辑操作数。

动态规划方程如下:

dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + (word1[i] != word2[j]))

  • dp[i-1][j] + 1:表示从 word1 中删除第 i 个字符。
  • dp[i][j-1] + 1:表示在 word1 中插入第 j 个字符。
  • dp[i-1][j-1] + (word1[i] != word2[j]):表示替换 word1 中的第 i 个字符为 word2 中的第 j 个字符。

代码实现

def min_distance(word1, word2):
    m, n = len(word1) + 1, len(word2) + 1
    dp = [[0] * n for _ in range(m)]

    for i in range(1, m):
        dp[i][0] = i

    for j in range(1, n):
        dp[0][j] = j

    for i in range(1, m):
        for j in range(1, n):
            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][j-1] + 1, dp[i-1][j-1] + 1)

    return dp[m-1][n-1]

示例

假设 word1 = "horse",word2 = "ros"。

      '' r o s
    - -------
    '' 0 1 2 3
    h 1 1 2 3
    o 2 2 1 2
    r 3 3 2 1
    s 4 4 3 2
    e 5 5 4 3

最小编辑距离为 3,对应的编辑操作序列为:

  1. 删除 "h"。
  2. 插入 "r"。
  3. 替换 "e" 为 "s"。

高级应用

掌握编辑距离算法不仅限于解决 LeetCode 难题。它在实际应用中也大显身手:

  • 拼写检查: 识别拼写错误并建议正确的单词。
  • 自然语言处理: 衡量文本相似性和机器翻译。
  • 生物信息学: 比对 DNA 序列和检测突变。

结语

LeetCode 第 72 题:编辑距离是算法世界中一颗耀眼的明珠,它不仅考验着你的编程技巧,更重要的是锻炼你的算法思维。通过深入理解动态规划的精髓,你可以破解这一难题,并为自己在算法领域的探索之旅添上浓墨重彩的一笔。