编辑距离

编辑距离

题目描述

\(A\)\(B\) 是两个字符串。我们要用最少的字符操作次数,将字符串 \(A\) 转换为字符串 \(B\)。这里所说的字符操作共有三种:

  1. 删除一个字符;
  2. 插入一个字符;
  3. 将一个字符改为另一个字符。

\(A, B\) 均只包含小写字母。

输入格式

第一行为字符串 \(A\);第二行为字符串 \(B\);字符串 \(A, B\) 的长度均小于 \(2000\)

输出格式

只有一个正整数,为最少字符操作次数。

样例 #1

样例输入 #1

sfdqxbw
gfdgw

样例输出 #1

4

代码实现

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int minDistance(string word1, string word2) {
    int m = word1.size();  // 字符串 A 的长度
    int n = word2.size();  // 字符串 B 的长度
    
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));  // 二维数组 dp,大小为 (m+1) x (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;  // 插入操作的次数
    }
    
    // 遍历字符串 A 和字符串 B 的每个字符
    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 {
                // 计算插入、删除和替换操作的最小次数,并加 1
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
            }
        }
    }
    
    return dp[m][n];  // 返回最终结果,即将字符串 A 转换为字符串 B 所需的最少操作次数
}

int main() {
    string A, B;
    cin >> A >> B;
    
    int result = minDistance(A, B);
    cout << result << endl;

    return 0;
}

posted @ 2023-08-30 15:00  LongDz  阅读(37)  评论(0)    收藏  举报