当前位置:  首页>> 技术小册>> 算法面试通关 50 讲

51 | 面试题:编辑距离

引言

在算法面试的浩瀚星空中,“编辑距离”(Edit Distance)问题犹如一颗璀璨的星辰,以其深刻的数学背景和广泛的应用领域,成为了众多面试官青睐的考题之一。编辑距离,又称莱文斯坦距离(Levenshtein Distance),衡量的是将一个字符串转换成另一个字符串所需的最少编辑操作次数,这些编辑操作包括插入、删除和替换字符。它不仅在文本处理、生物信息学、拼写检查等领域有重要应用,也是评估字符串相似度的一种有效手段。

问题定义

给定两个字符串s1s2,要求计算它们之间的编辑距离。编辑距离定义为将s1转换为s2所需的最少单字符编辑(插入、删除或替换)次数。

解决方案概述

解决编辑距离问题最经典且高效的方法是使用动态规划(Dynamic Programming, DP)。动态规划通过将原问题拆解为规模较小的子问题,并存储子问题的解来避免重复计算,从而优化整体性能。

动态规划解法

1. 定义状态

dp[i][j]表示将s1的前i个字符转换为s2的前j个字符所需的最少编辑次数。注意,这里的“前i个字符”和“前j个字符”是包含索引i-1j-1的字符在内的子串。

2. 初始化
  • i=0时,即s1为空字符串,要将空字符串转换成s2的前j个字符,只能通过j次插入操作,因此dp[0][j] = j
  • 同理,当j=0时,dp[i][0] = i,即将s1的前i个字符转换为空字符串,需要i次删除操作。
3. 状态转移方程

对于i > 0j > 0的情况,我们需要考虑三种操作:

  • 替换:如果s1[i-1] == s2[j-1],则当前字符无需编辑,直接继承前一个状态的结果,即dp[i][j] = dp[i-1][j-1]
  • 插入:在s1的第i个位置插入一个与s2[j-1]相同的字符,相当于将s1的前i-1个字符转换为s2的前j个字符,然后再添加一个字符(即插入操作),所以dp[i][j] = dp[i-1][j] + 1
  • 删除:删除s1的第i个字符,相当于将s1的前i-1个字符转换为s2的前j个字符,因此dp[i][j] = dp[i][j-1] + 1

综合以上三种情况,取最小值作为dp[i][j]的值,即:

[
dp[i][j] = \min(dp[i-1][j-1] + (s1[i-1] \neq s2[j-1]), dp[i-1][j] + 1, dp[i][j-1] + 1)
]

4. 填表过程

按照上述状态转移方程,从dp[0][0]开始,逐步填充整个dp表,直到dp[m][n],其中mn分别是s1s2的长度。

5. 返回结果

最终,dp[m][n]即为所求的编辑距离。

代码实现(Python)

  1. def minDistance(s1, s2):
  2. m, n = len(s1), len(s2)
  3. dp = [[0] * (n + 1) for _ in range(m + 1)]
  4. # 初始化
  5. for i in range(m + 1):
  6. dp[i][0] = i
  7. for j in range(n + 1):
  8. dp[0][j] = j
  9. # 填表
  10. for i in range(1, m + 1):
  11. for j in range(1, n + 1):
  12. if s1[i - 1] == s2[j - 1]:
  13. cost = 0
  14. else:
  15. cost = 1
  16. dp[i][j] = min(dp[i - 1][j - 1] + cost, dp[i - 1][j] + 1, dp[i][j - 1] + 1)
  17. return dp[m][n]
  18. # 示例
  19. s1 = "kitten"
  20. s2 = "sitting"
  21. print(minDistance(s1, s2)) # 输出: 3

复杂度分析

  • 时间复杂度:O(m * n),其中m和n分别是两个字符串的长度。因为需要填充一个m+1行n+1列的二维数组。
  • 空间复杂度:O(m * n),同样是由于需要存储m+1行n+1列的二维数组。

优化空间复杂度

虽然上述解法在时间和空间上都是高效的,但有时候面试中可能会要求进一步优化空间复杂度。观察状态转移方程,我们可以发现dp[i][j]只依赖于其左边、上边和左上方的值,因此可以使用滚动数组或一维数组来优化空间复杂度至O(n)。

应用场景

编辑距离在多个领域都有广泛的应用,包括但不限于:

  • 拼写检查:在自动拼写检查系统中,编辑距离可以帮助识别并纠正打字错误。
  • 生物信息学:在DNA序列分析中,编辑距离用于衡量不同物种间的基因序列差异。
  • 数据清洗:在数据预处理阶段,编辑距离可以用来识别并修正数据集中的不一致性。

结语

编辑距离问题不仅考察了面试者对动态规划算法的理解和掌握程度,还考验了其对问题建模和优化的能力。通过深入理解编辑距离的原理和实现细节,我们可以更好地应对面试中的类似问题,并在实际项目中灵活运用这一强大的工具。


该分类下的相关小册推荐: