编辑距离问题是字符串处理中的经典问题之一,广泛应用于拼写纠正、DNA序列比对等领域。通过计算将一个字符串转换为另一个字符串所需的最小操作数,能够帮助我们评估它们之间的相似度。本文将详细分析编辑距离问题的基本思路,提供动态规划的实现方法,并展示 Python 和 C++ 的代码示例。

编辑距离(Edit Distance)是衡量两个字符串之间相似度的一种方法,定义为将一个字符串转换为另一个字符串所需的最少操作次数。允许的操作包括插入字符、删除字符和著换字符。
word1 和 word2,其长度分别为 和
。
为将 word1 的前
个字符转换为 word2 的前
个字符所需的最小操作次数。
, 则
(不需要任何操作)。
,其大小为
,用于存储不同状态的结果。
, 表示将 word1 的前
个字符转换为空字符串的操作次数(全部删除)。
,表示将空字符串转换为 word2 的前
个字符的操作次数(全部插入)。
,即将整个 word1 转换为 word 2 的最小操作次数。
只依赖于
和
,可以将空间复杂度优化到
,只使用一维数组。
,适合中等规模的字符串比较。
以上就是问题的基本思路。
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
# 创建dp数组
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 初始化边界条件
for i in range(m + 1):
dp[i][0] = i # word1 到空字符串的距离
for j in range(n + 1):
dp[0][j] = j # 空字符串到 word2 的距离
# 填充dp数组
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] = min(dp[i - 1][j] + 1, # 删除
dp[i][j - 1] + 1, # 插入
dp[i - 1][j - 1] + 1) # 替换
# 返回最小编辑距离
return dp[m][n]dp 数组并设置边界条件,分别表示将一个字符串转换为空字符串的操作次数。dp[m][n],即将整个 word1 转换为 word2 所需的最小操作次数。class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
// 创建dp数组
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 初始化边界条件
for (int i = 0; i <= m; i++) {
dp[i][0] = i; // word1 到空字符串的距离
}
for (int j = 0; j <= n; j++) {
dp[0][j] = j; // 空字符串到 word2 的距离
}
// 填充dp数组
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
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][n];
}
};dp 数组并设置边界条件,分别表示将一个字符串转换为空字符串的操作次数。dp 数组。dp[m][n],即将整个 word1 转换为 word2 所需的最小操作次数。