编辑距离(Edit Distance),也称为 Levenshtein 距离,是衡量两个字符串之间相似程度的指标。它表示将一个字符串转换成另一个字符串所需的最少编辑操作次数。常见的编辑操作包括插入一个字符、删除一个字符、替换一个字符。
在 C++ 中实现编辑距离的计算通常使用动态规划的方法。具体步骤如下:
-
创建一个二维数组
dp
,其中dp[i][j]
表示将字符串s1
的前i
个字符转换为字符串s2
的前j
个字符所需的最小编辑距离。 -
初始化第一行和第一列:
dp[i][0] = i
,表示将字符串s1
的前i
个字符转换为空串所需的编辑距禽为i
。dp[0][j] = j
,表示将空串转换为字符串s2
的前j
个字符所需的编辑距禽为j
。
-
逐个填充数组
dp
:- 当
s1[i-1] == s2[j-1]
(字符串下标从0开始)时,dp[i][j] = dp[i-1][j-1]
,表示当前字符相等,无需进行额外的编辑操作。 - 否则,取以下三种操作的最小值:
- 插入操作:
dp[i][j] = dp[i][j-1] + 1
- 删除操作:
dp[i][j] = dp[i-1][j] + 1
- 替换操作:
dp[i][j] = dp[i-1][j-1] + 1
- 插入操作:
- 当
-
最终返回
dp[s1.length()][s2.length()]
即为字符串s1
转换为字符串s2
的最小编辑距禛。
下面是一个简单的 C++ 示例代码,实现了计算字符串之间编辑距离的功能:
#include <iostream>
#include <string>
#include <vector>int minDistance(std::string word1, std::string word2) {int m = word1.length();int n = word2.length();std::vector<std::vector<int>> dp(m+1, std::vector<int>(n+1, 0));for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}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] = 1 + std::min(dp[i-1][j-1], std::min(dp[i-1][j], dp[i][j-1]));}}}return dp[m][n];
}int main() {std::string s1 = "kitten";std::string s2 = "sitting";int result = minDistance(s1, s2);std::cout << "The edit distance between '" << s1 << "' and '" << s2 << "' is: " << result << std::endl;return 0;
}
以上代码演示了如何使用动态规划方法计算两个字符串之间的编辑距禛。你可以使用这个示例作为起点,根据实际需求进一步扩展和优化。