计算两个字符串的编辑距离

计算两个字符串的编辑距离,也称为 Levenshtein 距离。该算法用于计算将字符串 a 转换为字符串 b 所需的最少操作次数(插入、删除或替换)。

修复和优化

当前代码存在一些错误和优化空间:

  1. 索引范围错误:外层循环应包括字符串的最后一个字符,即应从 0 开始遍历到字符串的长度。
  2. 初始化错误:动态规划数组需要适当初始化边界条件。
  3. 内层逻辑错误:需修正字符匹配的逻辑和 DP 转移的逻辑。
  4. 变量命名和代码结构的优化:提高可读性。

修复和优化后的代码

pythonCopy codedef distance_between(a, b):
    # 确定 DP 表的大小
    n, m = len(a), len(b)
    dp = [[0] * (m + 1) for _ in range(n + 1)]

    # 初始化 DP 表的边界条件
    for i in range(n + 1):
        dp[i][0] = i  # 将 a 的前 i 个字符转为空的操作数
    for j in range(m + 1):
        dp[0][j] = j  # 将 b 的前 j 个字符插入的操作数

    # 填充 DP 表
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if a[i - 1] == b[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]  # 字符相同,不需要操作
            else:
                dp[i][j] = min(
                    dp[i - 1][j] + 1,    # 删除 a[i-1]
                    dp[i][j - 1] + 1,    # 插入 b[j-1]
                    dp[i - 1][j - 1] + 1 # 替换 a[i-1] 为 b[j-1]
                )

    return dp[n][m]

# 示例测试
a = "kitten"
b = "sitting"
print(distance_between(a, b))  # 输出:3

优化后的代码解释

  1. DP 表的初始化
    • dp[i][0] 表示将字符串 a 的前 i 个字符转换为空串所需的最小操作数,即 i 次删除。
    • dp[0][j] 表示将空串转换为字符串 b 的前 j 个字符所需的最小操作数,即 j 次插入。
  2. DP 转移方程
    • 如果 a[i-1] == b[j-1],则不需要操作,dp[i][j] = dp[i-1][j-1]
    • 如果 a[i-1] != b[j-1],则需要在以下三种操作中取最小值:
      1. 删除操作dp[i-1][j] + 1,表示删除 a[i-1]
      2. 插入操作dp[i][j-1] + 1,表示在 a 中插入 b[j-1]
      3. 替换操作dp[i-1][j-1] + 1,表示将 a[i-1] 替换为 b[j-1]
  3. 时间复杂度O(n * m),其中 nm 分别是字符串 ab 的长度。
  4. 空间复杂度O(n * m),用于存储 DP 表。

进一步优化

如果空间是一个瓶颈,可以使用滚动数组将空间复杂度优化为 O(min(n, m)),不过这会增加代码的复杂性。

0 0 投票数
Article Rating
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x