返回
理解 LeetCode 第 72 题:编辑距离的精髓
IOS
2024-02-05 08:25:38
算法奇旅:从理解 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,对应的编辑操作序列为:
- 删除 "h"。
- 插入 "r"。
- 替换 "e" 为 "s"。
高级应用
掌握编辑距离算法不仅限于解决 LeetCode 难题。它在实际应用中也大显身手:
- 拼写检查: 识别拼写错误并建议正确的单词。
- 自然语言处理: 衡量文本相似性和机器翻译。
- 生物信息学: 比对 DNA 序列和检测突变。
结语
LeetCode 第 72 题:编辑距离是算法世界中一颗耀眼的明珠,它不仅考验着你的编程技巧,更重要的是锻炼你的算法思维。通过深入理解动态规划的精髓,你可以破解这一难题,并为自己在算法领域的探索之旅添上浓墨重彩的一笔。